题解 P8014 [COCI2013-2014#4] SUMO

大家好,我是 CQ-C2024 蒟蒻 CJH。

题意

题目描述写得很清楚了。

标签:并查集。

分析题目

此题就是一道近似于模板的一道并查集的题。

在这里我用 $fa_i$ 表示 $i$ 是属于哪一队的,用 $d_i$ 表示 $i$ 的敌队。

在 $m$ 次比赛中,需要判断 $A_i$ 和 $B_i$ 是否为相同的队伍,如果是就直接输出此场比赛 $i$。

否则当 $A_i$ 的敌队不为初始状态时,合并 $d_{A_i}$ 和 $B_i$;同样再对 $d_{B_i}$ 和 $A_i$ 执行此操作。

代码实现

//the code is from chenjh
#include<cstdio>
#define MAXN 100001
using namespace std;
int fa[MAXN],d[MAXN];
inline int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
void merge(int x,int y){fa[x]=y;}
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) fa[i]=i;//初始化 fa 数组。
    for(int t=1,x,y;t<=m;t++){
        scanf("%d%d",&x,&y);
        int rx=find(x),ry=find(y);//获得两队队伍。
        if(rx==ry) return printf("%d\n",t),0;//如果两队队伍相同则输出并结束程序。
        if(d[x] && find(d[x])!=ry) merge(find(d[x]),ry);//合并
        if(d[y] && find(d[y])!=rx) merge(find(d[y]),rx);
        d[x]=ry,d[y]=rx;//记录敌队
    }
    return 0;
}

谢谢大家!

posted @ 2022-10-19 21:22  Chen_Jinhui  阅读(14)  评论(0)    收藏  举报  来源