标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 10482 Accepted Submission(s): 3373
很明显的要用dijkstra,但是估计大家用一般的方法建图的时候都会超时吧,因为起点不止一个,起点多就要多次调用函数,因此超时!
倒不如反向建图,变成一个起点,多个终点!
另外注意:公车车是单向的!
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define MAX 0x3f3f3f3f 5 using namespace std; 6 int map[1010][1010],d[1010],n,m,s,t; 7 void dijkstra(int x) 8 { 9 int i,j,min,mark,used[1010]; 10 for(i=1;i<=n;i++) 11 { 12 used[i]=0; 13 d[i]=map[x][i]; 14 } 15 d[x]=0; 16 used[x]=1; 17 for(i=1;i<=n;i++) 18 { 19 min=MAX; 20 mark=-1; 21 for(j=1;j<=n;j++) 22 { 23 if(!used[j]&&d[j]<min) 24 { 25 min=d[j]; 26 mark=j; 27 } 28 } 29 if(mark==-1) 30 break; 31 used[mark]=1; 32 for(j=1;j<=n;j++) 33 { 34 if(!used[j]&&d[j]>d[mark]+map[mark][j]) 35 d[j]=d[mark]+map[mark][j]; 36 } 37 } 38 39 } 40 int main() 41 { 42 int a,b,c,i,j; 43 while(scanf("%d%d%d",&n,&m,&s)!=EOF) 44 { 45 memset(map,MAX,sizeof(map)); 46 for(i=0;i<m;i++) 47 { 48 scanf("%d%d%d",&a,&b,&c); 49 if(map[b][a]>c) 50 map[b][a]=c; 51 } 52 dijkstra(s);//调用一次 53 int start; 54 int mi=MAX; 55 scanf("%d",&t); 56 for(i=0;i<t;i++)//找出最小的花费 57 { 58 scanf("%d",&start); 59 mi=mi<d[start]?mi:d[start]; 60 } 61 if(mi==MAX) 62 printf("-1\n"); 63 else 64 printf("%d\n",mi); 65 } 66 return 0; 67 }
Choose the best route--hdu2680
标签:
原文地址:http://www.cnblogs.com/Eric-keke/p/4739449.html