POJ 3169 Layout

两个关系好的牛之间不能超过一定的距离,两个关系不好的牛之间的距离不能少一定的距离。如果存在负还输出-1,牛1和牛N不连通 输出-2,否则输出他们的之间距离。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cstdlib>
 4 
 5 struct N
 6 {
 7     int u,v,w;
 8 } edge[20010];
 9 
10 int dis[1010];
11 int INF = (1<<29);
12 
13 int bellman_ford(int n,int e)
14 {
15     int flag;
16     int i,j,k,u,v,w;
17     for(i = 1;i < n; i++)
18     {
19         flag = 1;
20         for(j = 0;j < e; j++)
21         {
22             u = edge[j].u;
23             v = edge[j].v;
24             w = edge[j].w;
25             if(dis[u] + w < dis[v])
26             {
27                 dis[v] = dis[u] + w;
28                 flag = 0;
29             }
30         }
31         if(flag) break;
32     }
33     for(j = 0;j < e; j++)
34     {
35          u = edge[j].u;
36             v = edge[j].v;
37             w = edge[j].w;
38             if( dis[u] + w < dis[v])
39             {
40                 return 1;
41             }
42     }
43     return 0;
44 }
45 
46 int main()
47 {
48     int n,m,l,i,e,u,v,w;
49    scanf("%d %d %d",&n,&m,&l);
50     
51         for(i = 1; i <= n; i++)
52         {
53             dis[i] = INF;
54         }
55         dis[1] = 0;
56         for(e = 0, i = 0; i < m; i++)
57         {
58             scanf("%d %d %d",&u,&v,&w);
59             edge[e].u = u;
60             edge[e].v = v;
61             edge[e].w = w;
62             e++;
63         }
64         for(i = 0; i < l; i++)
65         {
66             scanf("%d %d %d",&u,&v,&w);
67             edge[e].u = v;
68             edge[e].v = u;
69             edge[e].w = -w;
70             e++;
71         }
72 
73    
74 
75         if(bellman_ford(n,e))
76             printf("-1\n");
77         else
78         {
79             if(dis[n] == INF)
80                 printf("-2\n");
81             else printf("%d\n",dis[n]);
82         }
83     
84     
85     return 0;
86 }
原文地址:https://www.cnblogs.com/zmx354/p/3041189.html