#include<cstdio>//挑战上的模版
#include<cstring>
#include<vector>
#define MAX_N 2049
using namespace std;
bool vis[MAX_N];
int cmp[MAX_N];
vector<int>G[MAX_N],rG[MAX_N],vs;
int V,n,m,rel[MAX_N],door[MAX_N][2];
void add_edge(int u,int v)
{
G[u].push_back(v);
rG[v].push_back(u);
}
void dfs(int v)
{
vis[v]=1;
for(int i=0;i<G[v].size();i++)
{
if(!vis[G[v][i]])
dfs(G[v][i]);
}
vs.push_back(v);
}
void rdfs(int v,int k)
{
vis[v]=1;
cmp[v]=k;
for(int i=0;i<rG[v].size();i++)
{
if(!vis[rG[v][i]])
rdfs(rG[v][i],k);
}
}
int scc()
{
memset(vis,0,sizeof(vis));
for(int i=0;i<V;i++)
{
if(!vis[i])
dfs(i);
}
int k=0;
memset(vis,0,sizeof(vis));
for(int i=vs.size()-1;i>=0;i--)
{
if(!vis[vs[i]])
rdfs(vs[i],k++);
}
return k;
}
int ok(int end)
{
for(int i=0;i<V;i++)
{
G[i].clear();
rG[i].clear();
}
vs.clear();
for(int i=0;i<end;i++)
{
add_edge(rel[door[i][0]],door[i][1]);
add_edge(rel[door[i][1]],door[i][0]);
}
scc();
for(int i=0;i<V;i++)
{
// printf("i=%d cmp=%d\n",i,cmp[i]);
if(cmp[i]==cmp[rel[i]])
return 0;
}
return 1;
}
int find()
{
int l=0,r=m+1;
while(r-l>1)
{
int mid=(l+r)>>1;
if(ok(mid))
l=mid;
else
r=mid;
}
return l;
}
int main()
{
while(~scanf("%d%d",&n,&m)&&(n+m))
{
V=2*n;
for(int i=0;i<n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
rel[a]=b;
rel[b]=a;
}
for(int i=0;i<m;i++)
scanf("%d%d",&door[i][0],&door[i][1]);
// for(int i=1;i<=7;i++)
// printf("%d\n",ok(i));
printf("%d\n",find());
}
return 0;
}
poj 2723 2-SAT
最新推荐文章于 2018-09-16 21:28:36 发布