poj 2723

2sat直接过。

代码:

#include<iostream>
#include<fstream>

using namespace std;

struct e{
	int data;
	e *next;
}edge[2300];
int n,m;

int v[2300],low[2300],dfn[2300],stack[2300],scc[2300],tot,index,top;

void tarjan(int s){
	int i,j,k;
	dfn[s]=low[s]=++index;
	stack[++top]=s;
	v[s]=1;
	e *p=edge[s].next;
	while(p){
		if(dfn[p->data]==0)
		{
			tarjan(p->data);
			low[s]=min(low[s],low[p->data]);
		}
		else
			if(v[p->data])
			{
				low[s]=min(low[s],dfn[p->data]);
			}
		p=p->next;
	}
	if(low[s]==dfn[s]){
		++tot;
		
		do{
			i=stack[top--];
			scc[i]=tot;
			
			v[i]=0;
		}while(i!=s);
	}
}



void solve(){
	int i,j,k;
	index=0;tot=0;top=0;
	memset(v,0,sizeof(v));
	memset(dfn,0,sizeof(dfn));
	for(i=1;i<=2*n;i++)
		if(dfn[i]==0)
			tarjan(i);
}

int hash[2300];
int ant[2300];

void read(){
//	ifstream cin("in.txt");
	int i,j,k,s;

	while(1)
	{
		cin>>n>>m;
		
		if(n==0&&m==0) return;
		memset(edge,0,sizeof(edge));
		for(i=1;i<=n;i++)
		{
			cin>>j>>k;
			hash[j]=i;
			hash[k]=i+n;
			ant[j]=k;
			ant[k]=j;
		}
		int f=0,ans=-1;
		for(i=1;i<=m;i++)
		{
			cin>>j>>k;
			
			if(f==0)
			{	
				e *p=new e;
				p->data=hash[k];
				p->next=edge[hash[ant[j]]].next;
				edge[hash[ant[j]]].next=p;

				e *q=new e;
				q->data=hash[j];
				q->next=edge[hash[ant[k]]].next;
				edge[hash[ant[k]]].next=q;
				
				solve();
				for(s=1;s<=n;s++)
					if(scc[s]==scc[s+n])
						break;
				if(s<=n)
				{
					ans=i-1;
					f=1;
				}
			}
		}
		if(ans!=-1)
			cout<<ans<<endl;
		else
			cout<<m<<endl;
	
	}

}

int main(){
	read();
	return 0;
}

posted on 2011-03-19 13:47  宇宙吾心  阅读(371)  评论(0)    收藏  举报

导航