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;
}

posted on 2011-05-09 18:54  宇宙吾心  阅读(283)  评论(0)    收藏  举报

导航