【TimeGate】 https://www.luogu.org/problem/P4878 【解题思路】 这是一道差分约束的裸题,瞎搞一下跑个最短路就可以了你还得去从0开始跑spfa判断图是不是联通的 【code】 1 #include bits/stdc++.h 2
【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 }