思路
如果一条边两个点连起来后,形成了一个封闭的圈,那么这两点之前肯定是再同一个联通块里面,所以只要用并查集判断一下连两个点的时候,是不是再同一个连通块内就可以了。
代码
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int p[40000];
int n,m;
int find(int x){
if(p[x]!=x)p[x]=find(p[x]);
return p[x];
}
int get(int x,int y){//得到点的编号
return (x-1)*n+y-1;
}
int main(){
cin >> n >> m;
for(int i=0;i<n*n;i++)p[i]=i;
int res=0;
for(int i=1;i<=m;i++){
int x,y;
char d;
cin >> x >> y >> d;
int a,b;
if(d=='D'){
a=x+1;
b=y;
}else{
a=x;
b=y+1;
}
int pa=find(get(x,y));int pb=find(get(a,b));
if(pa==pb){
res=i;
break;
}
p[pa]=pb;
}
if(!res)cout << "draw";
else cout << res;
}