hdu 2066 一个人的 旅行
2016-01-04 18:03
225 查看
#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; }
相关文章推荐