L2-010. 排座位

L2-010. 排座位

题目链接:https://www.patest.cn/contests/gplt/L2-010

并查集

相关题目:L2-007. 家庭房产L3-003. 社交集群

下午打的时候什么都没用,直接上一个矩阵,没有考虑“甲是a的朋友,a是b的朋友,b是乙的朋友”这种多个人关系的情况,华丽WA。出来问了学长,用的是并查集,用一个矩阵来表示两人之间的敌对关系(写的时候还是WA了好多次,最后才发现是"No way"的"w"打成了大写QAQ)

代码如下:

 1 #include<cstdio>
 2 using namespace std;
 3 bool enemy[105][105];
 4 int pre[105];
 5 int Find(int a){
 6     if(a!=pre[a])pre[a]=Find(pre[a]);
 7     return pre[a];
 8 }
 9 void uion(int a,int b){
10     int t1=Find(a),t2=Find(b);
11     if(t1!=t2)pre[t1]=t2;
12 }
13 void make(int n){
14     for(int i=1;i<=n;i++)pre[i]=i;
15 }
16 int main(void){
17     int n,m,k;
18     scanf("%d%d%d",&n,&m,&k);
19     make(n);
20     while(m--){
21         int a,b,g;
22         scanf("%d%d%d",&a,&b,&g);
23         if(g==1)uion(a,b);
24         else enemy[a][b]=enemy[b][a]=1; //a和b是敌人
25     }
26     while(k--){
27         int a,b;
28         scanf("%d%d",&a,&b);
29         int ta=Find(a),tb=Find(b);
30         if(enemy[a][b]){
31             if(ta==tb)printf("OK but...
");
32             else printf("No way
");
33         }else{
34             if(ta==tb)printf("No problem
");
35             else printf("OK
");
36         }
37     }
38     return 0;
39 }
原文地址:https://www.cnblogs.com/barrier/p/5559559.html