Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1974 Accepted Submission(s):
979
There is something interesting. Some like each other and want to be within a certain distance of each other in line. Some really dislike each other and want to be separated by at least a certain distance. A list of X (1 <= X <= 10,000) constraints describes which person like each other and the maximum distance by which they may be separated; a subsequent list of Y constraints (1 <= Y <= 10,000) tells which person dislike each other and the minimum distance by which they must be separated.
Your job is to compute, if possible, the maximum possible distance between person 1 and person N that satisfies the distance constraints.
The next line: Three space-separated integers: N, X, and Y.
The next X lines: Each line contains three space-separated positive integers: A, B, and C, with 1 <= A < B <= N. Person A and B must be at most C (1 <= C <= 1,000,000) apart.
The next Y lines: Each line contains three space-separated positive integers: A, B, and C, with 1 <= A < B <= C. Person A and B must be at least C (1 <= C <= 1,000,000) apart.
#include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define MAXN 1000010 using namespace std; queue<int>que; int n,x,y,t,tot; int vis[MAXN],dis[MAXN],cnt[MAXN]; int to[MAXN],net[MAXN],cap[MAXN],head[MAXN]; void add(int u,int v,int w){ to[++tot]=v;cap[tot]=w;net[tot]=head[u];head[u]=tot; } void spfa(){ memset(cnt,0,sizeof(cnt)); memset(vis,0,sizeof(vis)); memset(dis,0x7f,sizeof(dis)); while(!que.empty()) que.pop(); dis[1]=0;vis[1]=1; cnt[1]=1;que.push(1); while(!que.empty()){ int now=que.front(); que.pop();vis[now]=0; for(int i=head[now];i;i=net[i]) if(dis[to[i]]>dis[now]+cap[i]){ dis[to[i]]=dis[now]+cap[i]; if(!vis[to[i]]){ if(++cnt[to[i]]>n){ printf("-1\n");return ; } vis[to[i]]=1; que.push(to[i]); } } } if(dis[n]==2139062143) printf("-2\n"); else printf("%d\n",dis[n]); } int main(){ scanf("%d",&t); while(t--){ scanf("%d%d%d",&n,&x,&y); for(int i=1;i<=x;i++){ int a,b,d; scanf("%d%d%d",&a,&b,&d); add(a,b,d); } for(int i=1;i<=y;i++){ int a,b,d; scanf("%d%d%d",&a,&b,&d); add(b,a,-d); } for(int i=1;i<=n;i++) add(i,i-1,0); spfa();tot=0;memset(head,0,sizeof(head)); } } /* 2 4 2 1 1 3 8 2 4 15 2 3 4 4 2 1 1 3 10 2 4 20 2 3 3 */