题解:[USACO05DEC]layout布局

又是很明显的差分约束

注意数组的大小问题

然后是碰到大于等于的情况转化为小于等于的情况建图

然后是spfa

需要判断有没有环

以及判断图是否连通

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<queue>
 6 using namespace std;
 7 const int m=10005;
 8 const int inf=0x3f3f3f3f;
 9 int head[m], dis[m], used[m];
10 bool vis[m];
11 int n, ml, md;
12 int cnt;
13 queue<int> q;
14 struct Edge{
15     int to, w, next;
16 }e[m*4];
17 void add(int u,int v,int w){
18     cnt++;
19     e[cnt].next=head[u];
20     e[cnt].w=w;
21     e[cnt].to=v;
22     head[u]=cnt;
23 }
24 bool spfa(int s){
25     memset(dis,0x3f,sizeof(dis));
26     memset(vis,0,sizeof(vis));
27     memset(used,0,sizeof(used));
28     dis[s]=0;
29     q.push(s);
30     vis[s]=true;
31     while(!q.empty()){
32         int u=q.front();
33         q.pop();
34         vis[u]=false;
35         for(int i=head[u]; i; i=e[i].next){
36             int v=e[i].to;
37             int w=e[i].w;
38             if(dis[v]>dis[u]+w){
39                 dis[v]=dis[u]+w;
40                 used[v]++;
41                 if(used[v]==n)
42                     return false;
43                 if(!vis[v]){
44                     q.push(v);
45                     vis[v]=true;
46                 }
47             }
48         }
49     }
50     return true;
51 }
52 int main(){
53     int a, b, d;
54     scanf("%d%d%d",&n,&ml,&md);
55     for(int i=1; i<=n; i++) add(0,i,0);
56     for(int i=1; i<=ml; i++){
57         scanf("%d%d%d",&a,&b,&d);
58         add(a,b,d);
59     }
60     for(int i=1; i<=md; i++){
61         scanf("%d%d%d",&a,&b,&d);
62         add(b,a,-d);
63     }
64     bool flag1=spfa(0);
65     bool flag2=spfa(1);
66     if(!flag1 || !flag2) puts("-1"); 
67     else if(dis[n]==inf) puts("-2");
68     else printf("%d",dis[n]);
69     return 0;
70 }
原文地址:https://www.cnblogs.com/Aze-qwq/p/9889267.html