hdu 2066 一个人的 旅行

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<stdlib.h>
#define INF 0x3f3f3f
using namespace std;
int mmax;
int map[1001][1001];
int sta[1001],en[1001];
//   起点     终点 
int floyd()
{
	int mmin=INF;
	int i,j,k;
	for(k=1;k<=mmax;k++)//把最大值保存在mmax中可以减少运行的次数,即时间 
	for(i=1;i<=mmax;i++)
	if(map[i][k]!=INF)
	for(j=1;j<=mmax;j++)
	{
		if(map[k][j]<INF&&map[i][k]+map[k][j]<map[i][j])
		{
			map[i][j]=map[i][k]+map[k][j];
		}
		if(sta[i]&&en[j]&&mmin>map[i][j])
		mmin=map[i][j];
	}
	return mmin;
}

int main()
{
	int t,s,d;
	int i,j;
	int a,b;
	int u,v,time;
	while(scanf("%d%d%d",&t,&s,&d)!=EOF)
	{
		memset(sta,0,sizeof(sta));//初始化sta 
		memset(en,0,sizeof(en));//初始化end 
		for(i=1;i<=1000;i++)//初始化map[][] 
		for(j=1;j<=1000;j++)
		map[i][j]=INF;
		
		for(i=1;i<=t;i++)//输入数据 
		{
			scanf("%d%d%d",&u,&v,&time);
			if(map[u][v]>time)
			{
				map[u][v]=time;
				map[v][u]=time;
			}
			if(u>mmax)
			mmax=u;
			if(v>mmax)
			mmax=v;
		}
		for(i=1;i<=s;i++)//这个方法是从网上借鉴过来的 
		{
			scanf("%d",&a);
			sta[a]=1;
		}
		for(i=1;i<=d;i++)
		{
			scanf("%d",&b);
			en[b]=1;
		}
		printf("%d\n",floyd());
	}
	return 0;
}下面代码结构出问题了,觉得以后编程就的注意结构方面的问题<pre name="code" class="cpp">#include<cstdio>
 #include<cstring>
 #include<cstdlib>
 #define inf 0x3fffffff
 int map[1001][1001],max;
 bool start[1001],end[1001];
 int floyd()
 {
     int i,j,k,min=inf;
     for(i=1;i<=max;++i)
         for(j=1;j<=max;++j)
             if(map[j][i]!=inf)
             {
                 for(k=1;k<=max;++k)
                 {
                     map[j][k]=map[j][k]<map[j][i]+map[i][k]?map[j][k]:map[j][i]+map[i][k];
                     if(start[j]&&end[k]&&min>map[j][k])   //j是起点而且k是终点,则直接找最小值
                         min=map[j][k];
                 }
             }
     return min;
 }
 
 int main()
 {
     int t,s,d,i,j,a,b,time,tmp;
     while(scanf("%d%d%d",&t,&s,&d)!=EOF)
     {
         max=0;
         for(i=1;i<=1000;++i)
             for(j=1;j<=1000;++j)
                 map[i][j]=inf;
         for(i=1;i<=t;++i)
         {
             scanf("%d%d%d",&a,&b,&time);
             max=max>a?max:b;       //max记录最大的城市编号,减小floyd计算量
             max=max>b?max:b;
             map[a][b]=map[b][a]=map[a][b]<time?map[a][b]:time;
         }
         memset(start,false,sizeof(start));
         memset(end,false,sizeof(end));
         for(i=0;i<s;++i)
         {
             scanf("%d",&tmp);
             start[tmp]=true;  //start数组用来标记是否是起点
         }
         for(i=0;i<d;++i)
         {
             scanf("%d",&tmp);
             end[tmp]=true;   //end数组用来标记是否是终点
         }
         printf("%d\n",floyd());
     }
     return 0;
 }


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值