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;
}
浙公网安备 33010602011771号