COJ1241(数字序列)

题目链接

并查集的题,食物链模型。

题目大意:已知关于n个数的m条信息,信息有两类,一类是已知Ai比Aj大K,另一类是已知Ai为K,问是否能从这m条信息中唯一确定这n个数,或者能推出矛盾。

View Code
 1 #include <stdio.h>
 2 #define N 10001
 3 #define M 20001
 4 int p[N],c[N],v[N];
 5 int a[M],b[M],cnt;
 6 char vis[N];
 7 int n,m;
 8 void make_set()
 9 {
10     int i;
11     for(i=0;i<n;i++)    p[i]=i,c[i]=0,vis[i]=0;
12 }
13 int find_set(int i)
14 {
15     int pi=p[i];
16     if(i!=pi)   p[i]=find_set(p[i]);
17     if(pi!=p[i])    c[i]+=c[pi];
18     return p[i];
19 }
20 void union_set(int i,int j,int d)
21 {
22     int pi=find_set(i),pj=find_set(j);
23     p[pi]=pj;
24     c[pi]=-c[i]+d+c[j];
25 }
26 int main()
27 {
28     int i,j,k,d;
29     char ch,RE,WA;
30     while(~scanf("%d%d",&n,&m))
31     {
32         make_set();
33         RE=WA=0;
34         for(k=cnt=0;k<m;)
35         {
36             scanf("%c",&ch);
37             if(ch=='B')
38             {
39                 k++;
40                 scanf("%d%d%d",&i,&j,&d);
41                 i--,j--;
42                 if(find_set(i)!=find_set(j))    union_set(i,j,d);
43                 else if(c[i]-c[j]!=d)   RE=1;
44             }
45             else if(ch=='S')
46             {
47                 k++;
48                 scanf("%d%d",&j,&d),j--;
49                 a[cnt]=j,b[cnt++]=d;
50             }
51         }
52         for(i=0;i<n;i++)    find_set(i);
53         for(i=0;!RE&&i<cnt;i++)
54         {
55             k=a[i];
56             d=b[i];;
57             j=find_set(k);
58             if(!vis[j])
59             {
60                 vis[j]=1;
61                 v[j]=d-c[k];
62             }
63             else if(v[j]!=d-c[k])   RE=1;
64         }
65         for(i=0;!RE&&!WA&&i<n;i++)  if(!vis[find_set(i)])   WA=1;
66         if(RE)  puts("RE");
67         else if(WA) puts("WA");
68         else    puts("AC");
69     }
70     return 0;
71 }
原文地址:https://www.cnblogs.com/algorithms/p/2464692.html