求多起点多终点中最短的路径(时长),用floyd算法,最重要的是优化
#include<iostream> #include<cstring> #include<cstdio> using namespace std; const int N=1002; const int INF=1<<27; int path[N][N]; bool start[N],end[N]; int manx,minn; int floyd() { int i,j,k; for(k=1;k<=manx;k++) for(i=1;i<=manx;i++) { if(path[i][k]!=INF)//优化:减少不必要的循环 for(j=1;j<=manx;j++) { if(path[i][j]>path[i][k]+path[k][j]) path[i][j]=path[i][k]+path[k][j]; if(start[i]&&end[j]&&minn>path[i][j]) minn=path[i][j]; } } return minn; } int main() { int i,j,t,s,d,a,b,time,link,love; while(scanf("%d%d%d",&t,&s,&d)!=EOF) { manx=0;minn=INF; for(i=1;i<=1000;i++) for(j=1;j<=1000;j++) path[i][j]=INF; for(i=1;i<=t;i++) { scanf("%d%d%d",&a,&b,&time); manx=manx<a?a:manx;//优化:取最大城市的编号 manx=manx<b?b:manx;// path[a][b]=path[b][a]=path[a][b]>time?time:path[a][b];//两个城市可能有多条路径,取最少时长 } memset(start,false,sizeof(start)); memset(end,false,sizeof(end)); for(i=1;i<=s;i++) { scanf("%d",&link); start[link]=true; } for(i=1;i<=d;i++) { scanf("%d",&love); end[love]=true; } printf("%d\n",floyd()); } return 0; }
Dijkstra算法+枚举
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=1002; const int INF=1<<27; int path[N][N],tmp[N],link[N],love[N];; bool s[N]; void dijkstra(int first,int n) { int i,j,u; memset(s,false,sizeof(s)); for(i=1;i<=n;i++) tmp[i]=path[first][i]; tmp[first]=0;s[first]=true; for(i=1;i<=n;i++) { int temp=INF; for(j=1;j<=n;j++) if(!s[j]&&tmp[j]<temp) temp=tmp[u=j]; s[u]=true; for(j=1;j<=n;j++) if(!s[j]&&tmp[j]>tmp[u]+path[u][j]) tmp[j]=tmp[u]+path[u][j]; } } int main() { int i,j,s,t,d,a,b,time; int manx,minn; while(scanf("%d%d%d",&s,&t,&d)!=EOF) { for(i=1;i<=1000;i++) for(j=1;j<=1000;j++) path[i][j]=INF; minn=INF;manx=0; for(i=1;i<=s;i++) { scanf("%d%d%d",&a,&b,&time); manx=manx>a?manx:a; manx=manx>b?manx:b; if(time<path[a][b]) path[a][b]=path[b][a]=time; } for(i=1;i<=t;i++) scanf("%d",&link[i]); for(i=1;i<=d;i++) scanf("%d",&love[i]); for(i=1;i<=t;i++) { dijkstra(link[i],manx); for(j=1;j<=d;j++) if(minn>tmp[ love[j] ]) minn=tmp[ love[j] ]; } printf("%d\n",minn); } return 0; }