高亮测试

#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;
}
View Code

猜你喜欢

转载自www.cnblogs.com/WindFreedom/p/9447378.html