hdu 2680 Choose the best route
TLE 一次,自己是把各个起点开始都算一次取最小的,结果超时。。。
后来看了一下结题报告,原来可以当做从0开始,,NB的大神。。
#include"stdio.h" #include"string.h" #define INF 999999 int map[1001][1001],mark[1001],f[1001]; int n,m,t,e; int min(int x,int y) { return x<y?x:y; } int dijkstra(int s) { int i,j,k,m; memset(mark,0,sizeof(mark)); for(i=1;i<=n;i++) f[i]=map[s][i]; f[s]=0;mark[s]=1; for(i=1;i<=n;i++) { m=INF; for(j=1;j<=n;j++) if(!mark[j]&&f[j]<m) { m=f[j];k=j; } if(m==INF)break; mark[k]=1; for(j=1;j<=n;j++) if(!mark[j]&&f[j]>f[k]+map[k][j]) f[j]=f[k]+map[k][j]; } if(f[e]<INF)return f[e]; else return -1; } int main() { int s,i,j,a,b,c,ans,mm; while(scanf("%d%d%d",&n,&m,&e)!=EOF) { for(i=0;i<=n;i++) for(j=0;j<=n;j++) map[i][j]=(i==j?0:INF); for(i=0;i<m;i++) { scanf("%d%d%d",&a,&b,&c); map[a][b]=min(map[a][b],c); } scanf("%d",&t); mm=INF; while(t--) { scanf("%d",&s); map[0][s]=0; } ans=dijkstra(0); if(ans==-1) printf("-1\n"); else printf("%d\n",ans); } return 0; }