#include<bits/stdc++.h> using namespace std; int Max(int a, int b) { return a > b ? a : b; } int Min(int a, int b) { return a > b ? b : a; } #define FOR(i,a,b) for(int i=a;i<=b;i++) typedef long long LL; typedef unsigned long long ull; const double INF = 99999999999.0; const double eps = 1e-6; #define MAX_N 1<<10 #define MAX_M 1<<11 #define MAX_V 2*MAX_N int n,m,num,index,scc; int key[MAX_V],door1[MAX_M],door2[MAX_M],id[MAX_V],dfn[MAX_V],low[MAX_V]; bool in[MAX_V]; vector<int>g[MAX_V]; stack<int>st; void init() { index=scc=0; memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(in,false,sizeof(in)); memset(id,0,sizeof(id)); FOR(i,1,n*2)g[i].clear(); while(!st.empty())st.pop(); } void add_edge(int u,int v) { g[u].push_back(v); } void tarjan(int u) { dfn[u]=low[u]=++index; st.push(u); in[u]=true; for(vector<int>::iterator it=g[u].begin();it!=g[u].end();it++){ int tmp=*it; if(dfn[tmp]==0){ tarjan(tmp); low[u]=min(low[u],low[tmp]); } else if(in[tmp]){ low[u]=min(low[u],dfn[tmp]); } } if(dfn[u]==low[u]){ ++scc; int v; do{ v=st.top();st.pop();in[v]=false; id[v]=scc; }while(v!=u); } } bool sat(int u) { num=n*2; for(int i=0;i<num;i++){ g[i].clear(); } for(int i=1;i<=u;i++){ add_edge(key[door1[i]],door2[i]); add_edge(key[door2[i]],door1[i]); } for(int i=0;i<num;i++)if(dfn[i]==0) tarjan(i); for(int i=0;i<num;i++){ if(id[i]==id[key[i]])return false; } return true; } int solve()//二分答案解决 { int low=1,high=m+1;//high 是达不到的 while(high-low>1){ int mid=(high+low)/2; init(); if(sat(mid)){ low=mid; } else high=mid; } return low; } int main() { while(scanf("%d %d",&n,&m)!=EOF&&n&&m){ for(int i=1;i<=n;i++){ int a,b; scanf("%d %d",&a,&b); key[a]=b;key[b]=a; } for(int i=1;i<=m;i++){ scanf("%d %d",&door1[i],&door2[i]); } printf("%d\n",solve()); } return 0; }
高亮测试
猜你喜欢
转载自www.cnblogs.com/WindFreedom/p/9447378.html
今日推荐
周排行