又是很明显的差分约束
注意数组的大小问题
然后是碰到大于等于的情况转化为小于等于的情况建图
然后是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 }