Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 628 Accepted Submission(s): 131
Sample Output
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 using namespace std; 6 #define N 305 7 #define MAX 0xfffffff 8 struct node{ 9 int root;//出发地点 10 int speed;//速度 11 double time;//时间 12 int min_len;//最短距离 13 int num;//第i个人的编号 14 }s[N]; 15 int f[N]; 16 int mark[N]; 17 int map[N][N]; 18 int n,m,k; 19 int p; 20 bool cmp(node a,node b) 21 { 22 if(a.time!=b.time) 23 return a.time<b.time; 24 else if(a.min_len!=b.min_len) 25 return a.min_len>b.min_len; 26 else 27 return a.num>b.num; 28 } 29 void Dijkstra() 30 { 31 int i,j,kk; 32 memset(mark,0,sizeof(mark)); 33 for(i=1;i<=n;i++) 34 f[i]=map[p][i]; 35 f[p]=0; 36 for(i=1;i<=n;i++) 37 { 38 int min=MAX; 39 for(j=1;j<=n;j++) 40 { 41 if(!mark[j]&&f[j]<min) 42 { 43 min=f[j]; 44 kk=j; 45 } 46 } 47 if(min==MAX) break; 48 mark[kk]=1; 49 for(j=1;j<=n;j++) 50 { 51 if(f[j]>f[kk]+map[kk][j]) 52 f[j]=f[kk]+map[kk][j]; 53 } 54 } 55 56 } 57 int main() 58 { 59 while(scanf("%d%d%d",&n,&m,&k)!=EOF) 60 { 61 memset(s,0,sizeof(s)); 62 int i,j; 63 for(i=1;i<=n;i++) 64 for(j=1;j<=n;j++) 65 map[i][j]=MAX; 66 67 for(i=1;i<=k;i++) 68 { 69 int a,b,c; 70 scanf("%d%d%d",&a,&b,&c); 71 map[b][a]=c; 72 } 73 scanf("%d",&p); 74 for(j=0;j<m;j++) 75 { 76 scanf("%d",&s[j].root); 77 s[j].num=j+1; 78 79 } 80 for(j=0;j<m;j++) 81 scanf("%d",&s[j].speed); 82 Dijkstra(); 83 84 for(j=0;j<m;j++) 85 { 86 87 s[j].min_len=f[s[j].root]; 88 s[j].time=1.0*s[j].min_len/s[j].speed; 89 90 } 91 sort(s,s+m,cmp); 92 if(s[0].min_len==MAX) 93 printf("No one\n"); 94 else 95 printf("%d\n",s[0].num); 96 } 97 return 0; 98 }