poj 1733
并查集
代码:
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
int f[10001];
int d[10001];
struct e{
int s,t;
};
vector<e> a[9950];
int n,m;
void init(){
int i,j,k;
for(i=1;i<=10000;i++)
{
f[i]=i;
}
}
int find(int s){
int i,j,k;
s=s%9949;
if(a[s].size()==0)
{
e b;
b.s=s;b.t=++m;
a[s].push_back(b);
return m;
}
else
{
for(i=0;i<a[s].size();i++)
{
if(a[s][i].s==s)
return a[s][i].t;
}
if(i>=a[s].size())
{
m++;
e b;
b.s=s;
b.t=m;
a[s].push_back(b);
return m;
}
}
}
int father(int s){
if(s==f[s]) return s;
else
{
int fa=father(f[s]);
d[s]=d[s]^d[f[s]];
return f[s]=fa;
}
}
int unionset(int s,int t,int p){
int i,j;
i=father(s);j=father(t);
if(i==j)
{
if(d[s]==d[t]^p)
return 1;
else return 0;
}
else
{
f[j]=i;
d[j]=d[s]^d[t]^p;
return 1;
}
}
void read(){
// ifstream cin("in.txt");
int i,j,k,s,t;
char c[10];
cin>>n;
if(n==0) {cout<<0<<endl;return;}
cin>>k;
if(k==0) {cout<<0<<endl;return;}
init();
int f=0,ans=-1;
for(i=1;i<=k;i++)
{
cin>>s>>t>>c;
if(f) continue;
s=find(s-1);
t=find(t);
int p;
if(strcmp(c,"odd")==0)
p=1;
else
p=0;
j=unionset(s,t,p);
if(!j){
f=1;
ans=i-1;
continue;
}
}
if(ans==-1) ans=k;
cout<<ans<<endl;
}
int main(){
read();
return 0;
}
浙公网安备 33010602011771号