cdoj1638 红藕香残玉簟秋,轻解罗裳,独上兰舟。
地址:http://acm.uestc.edu.cn/#/problem/show/1638
题目:
红藕香残玉簟秋,轻解罗裳,独上兰舟。
Time Limit: 4000/2000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
考试结束后,为了证明自己才是最蒻的,同学们纷纷去找老师查分阅数—哦不—是查阅分数。
可老师担心学生知道自己的成绩会伤心,于是只告诉学生这样的信息:
编号为 uu 的学生分数比编号为 vv 的学生分数高 ww 分甚至更多。
知道这些信息后,同学们想知道自己分数可能的 最小值 和 最大值 。不过老师记性不太好,给出的信息可能有误。
Input
第一行两个整数 nn 和 mm,表示学生个数和老师给的信息数。
接下来 mm 行每行三个整数 uu 、vv 和 ww,含义如上文所描述。
学生从 11 到 nn 编号,学生的分数为 00 到 100100 之间的整数。
1≤n≤1000001≤n≤100000,1≤m≤10000001≤m≤1000000,1≤u1≤u 、v≤nv≤n,0≤w≤1000≤w≤100 。
Output
若老师给出的信息有误,仅输出一行 −1−1 。
否则输出 nn 行,第 ii 行为以空格隔开的两个整数,分别表示编号为 ii 的学生的分数可能的 最小值 和 最大值 。
Sample input and output
Sample Input | Sample Output |
---|---|
2 2
1 2 1
2 1 1
|
-1
|
3 2
1 2 1
2 3 1
|
2 100
1 99
0 98
|
Source
2017 UESTC Training for Graph Theory
思路:
差分约束。
求最大值,跑最短路,建一条从v到u权值为w的边。
求最小值,跑最长路,建一条从u到v权值为-w的边。
别用vector存边,会T的不省人事,别问我怎么知道的!
1 #include <bits/stdc++.h>
2
3 using namespace std;
4
5 #define MP make_pair
6 #define PB push_back
7 typedef long long LL;
8 typedef pair<int,int> PII;
9 const double eps=1e-8;
10 const double pi=acos(-1.0);
11 const int K=1e6+7;
12 const int mod=1e9+7;
13
14 struct node
15 {
16 int to,v,next;
17 node(){}
18 node(int x,int y,int z){to=x,v=y,next=z;}
19 }eg1[2*K],eg2[2*K];
20 int t1,t2,hd1[K],hd2[K];
21 void add(int u,int v,int w,int op)
22 {
23 if(op&1)
24 eg1[t1]=node(v,w,hd1[u]),hd1[u]=t1++;
25 else
26 eg2[t2]=node(v,w,hd2[u]),hd2[u]=t2++;
27 }
28 int n,m,cnt[K],inque[K],mx[K],mi[K],Q[K];
29 bool spfa1(void)
30 {
31 int top=0;
32 memset(mi,-1,sizeof mi);
33 Q[top++]=0,inque[0]=1,cnt[0]=1,mi[0]=0;
34 while(top)
35 {
36 int u=Q[--top];
37 inque[u]=0;
38 for(int i=hd1[u];~i;i=eg1[i].next)
39 {
40 int v=eg1[i].to,w=eg1[i].v;
41 if(mi[v]<mi[u]+w)
42 {
43 mi[v]=mi[u]+w;
44 if(inque[v]) continue;
45 if(cnt[v]>n) return 0;
46 Q[top++]=v,inque[v]=1,cnt[v]++;
47 }
48
49 }
50 }
51 return 1;
52 }
53 bool spfa2(void)
54 {
55 int top=0;
56 memset(inque,0,sizeof inque);
57 memset(cnt,0,sizeof cnt);
58 memset(mx,0x3f3f3f3f,sizeof mx);
59 Q[top++]=0,inque[0]=1,cnt[0]=1,mx[0]=100;
60 while(top)
61 {
62 int u=Q[--top];
63 inque[u]=0;
64 for(int i=hd2[u];~i;i=eg2[i].next)
65 {
66 int v=eg2[i].to,w=eg2[i].v;
67 if(mx[v]>mx[u]+w)
68 {
69 mx[v]=mx[u]+w;
70 if(inque[v]) continue;
71 if(cnt[v]>n) return 0;
72 Q[top++]=v,inque[v]=1,cnt[v]++;
73 }
74 }
75 }
76 for(int i=1;i<=n;i++)
77 if(min(mi[i],mx[i])<0||max(mx[i],mi[i])>100)
78 return 0;
79 return 1;
80 }
81 int main(void)
82 {
83 memset(hd1,-1,sizeof hd1);
84 memset(hd2,-1,sizeof hd2);
85 scanf("%d%d",&n,&m);
86 for(int i=1,u,v,w;i<=m;i++)
87 scanf("%d%d%d",&u,&v,&w),add(v,u,w,1),add(u,v,-w,2);
88 for(int i=1;i<=n;i++)
89 add(0,i,0,1),add(0,i,0,2);
90 if(spfa1()&&spfa2())
91 for(int i=1;i<=n;i++)
92 printf("%d %d\n",mi[i],mx[i]);
93 else
94 printf("-1\n");
95 return 0;
96 }
作者:weeping
出处:www.cnblogs.com/weeping/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。