1. 程式人生 > >cdoj1638 紅藕香殘玉簟秋,輕解羅裳,獨上蘭舟。

cdoj1638 紅藕香殘玉簟秋,輕解羅裳,獨上蘭舟。

思路 else body 0ms min ram col space tin

地址: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 之間的整數。

1n1000001≤n≤100000,1m10000001≤m≤1000000,1u1≤u 、vnv≤n,0w1000≤w≤100 。

Output

若老師給出的信息有誤,僅輸出一行 ?1?1 。

否則輸出 nn 行,第 ii 行為以空格隔開的兩個整數,分別表示編號為 ii 的學生的分數可能的 最小值最大值

Sample input and output

Sample InputSample 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 }

cdoj1638 紅藕香殘玉簟秋,輕解羅裳,獨上蘭舟。