1 #include<stdio.h>
2 #include<math.h>
3 #include<string.h>
4 #include<queue>
5 using namespace std;
6 struct Edge
7 {
8 int to; //边终点
9 int w; //边值
10 int next;//结构体模拟链表
11 }edge[50005];
12 int m,n,target,outqueue[305],used[305],head[305],dis[305],start[305],speed[305];
13 int spfa(int sta)
14 {
15 int temp,i;
16 queue<int>q;
17 while (!q.empty()) q.pop();
18 used[sta]=1; dis[sta]=0; q.push(sta);
19 while (!q.empty())
20 {
21 temp=q.front(); q.pop();
22 outqueue[temp]++; used[temp]=0;
23 if (outqueue[temp]>n) return -1;
24 for (i=head[temp];i!=-1;i=edge[i].next)
25 if (dis[edge[i].to]>dis[temp]+edge[i].w)
26 {
27 dis[edge[i].to]=dis[temp]+edge[i].w;
28 if (used[edge[i].to]==0)
29 {
30 used[edge[i].to]=1;
31 q.push(edge[i].to);
32 }
33 }
34 }
35 return 1;
36 }
37 int main()
38 {
39 int i,k,a,b,w,judge,maxdis,x;
40 double min;
41 while (~scanf("%d%d%d",&n,&m,&k))
42 {
43 memset(outqueue,0,sizeof(outqueue));//出队次数判断负权回路
44 memset(used,0,sizeof(used));//用不用加入队列
45 memset(head,-1,sizeof(head));//数组模拟链表
46 for (i=1;i<=n;i++) dis[i]=10000000;
47 for (i=1;i<=k;i++)
48 {
49 scanf("%d%d%d",&b,&a,&w);
50 edge[i].to=b;
51 edge[i].w=w;
52 edge[i].next=head[a];
53 head[a]=i;
54 }
55 scanf("%d",&target);
56 for (i=1;i<=m;i++) scanf("%d",&start[i]);
57 for (i=1;i<=m;i++) scanf("%d",&speed[i]);
58 min=10000000.0; maxdis=0;
59 judge=spfa(target);
60 for (i=1;i<=m;i++)
61 {
62 x=dis[start[i]];
63 if (x!=10000000&&(1.0*x/speed[i]<min||(fabs(1.0*x/speed[i]-min)<1e-6&&x>=maxdis)))
64 { min=1.0*x/speed[i]; maxdis=x; judge=i; }
65 }
66 if (fabs(min-10000000.0)<1e-6) printf("No one\n");
67 else printf("%d\n",judge);
68 }
69 }
http://acm.hdu.edu.cn/showproblem.php?pid=2145