[USACO05DEC] 布局

【TimeGate】

https://www.luogu.org/problem/P4878

【解题思路】

这是一道差分约束的裸题,瞎搞一下跑个最短路就可以了你还得去从0开始跑spfa判断图是不是联通的

【code】

 1 #include <bits/stdc++.h>
 2 #define INF 0x3f3f3f3f
 3 #define main mian
 4 using namespace std;
 5 const int N=1005;
 6 const int M=40005;
 7 int n,ml,md,a,b,d;
 8 struct EDGE
 9 {
10     int nxt,to,wei,;
11 }edge[M];
12 int head[N],tot;
13 inline void add(int x,int y,int v)
14 {
15     edge[++tot].nxt=head[x];
16     edge[tot].to=y;
17     edge[tot].wei=v;
18     head[x]=tot;
19 }
20 queue<int> q;
21 int vis[N],dis[N],circle[N];
22 void spfa(int s)
23 {
24     memset(dis,0x3f,sizeof(dis));
25     memset(vis,0,sizeof(vis));
26     memset(circle,0,sizeof(circle));
27     q.push(s);
28     vis[s]=1,dis[s]=0;
29     while(!q.empty())
30     {
31         int now=q.front(); q.pop(); vis[now]=0;
32         for(int i=head[now];i;i=edge[i].nxt)
33         {
34             int tt=edge[i].to;
35             if(dis[now]+edge[i].wei<dis[tt])
36             {
37                 dis[tt]=dis[now]+edge[i].wei;
38                 circle[tt]=circle[now]+1;
39                 if(circle[tt]>=n)
40                 {
41                     puts("-1");exit(0);
42                 }
43                 if(!vis[tt])
44                 {
45                     vis[tt]=1;
46                     q.push(tt);
47                 }
48             }
49         }
50     }
51 
52 }
53 int main()
54 {
55     int n;
56     scanf("%d%d%d",&n,&ml,&md);
57     for(int i=1;i<=n;i++) add(0,i,0);
58     for(int i=1;i<=ml;i++)
59     {
60         scanf("%d%d%d",a,b,d);
61         add(a,b,d);
62     }
63     for(int i=1;i<=md;i++)
64     {
65         scanf("%d%d%d",a,b,d);
66         add(b,a,-d);
67     }
68     spfa(0);
69     spfa(1);
70     if(dis[n]==INF) puts("-2");
71     else printf("%d",dis[n]);
72     return 0;
73 }

 

posted @ 2019-09-22 13:01  GTR_PaulFrank  阅读(115)  评论(0编辑  收藏  举报