Ikki's Story IV - Panda's Trick POJ - 3207_dfs跑2-SAT


Code:

#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=3000;
int c=0;
int mark[maxn],S[maxn],from[maxn],to[maxn];
vector<int>G[maxn];
void add_edge(int x,int y){    
    x=(x*2)+1,y=(y*2)+1;
    G[x-1].push_back(y);       //里->外
    G[y-1].push_back(x);       //里->外
    G[x].push_back(y-1);       //外->里
    G[y].push_back(x-1);       //外->里
}
void build(int m){
    for(int i=0;i<m-1;++i)
        for(int j=i+1;j<m;++j)
            if((from[j]<from[i]&&to[j]<to[i]&&to[j]>from[i])||(from[i]<from[j]&&to[i]<to[j]&&to[i]>from[j]))
                add_edge(i,j);
}
int dfs(int x)
{
    if(mark[x^1])return 0;
    if(mark[x])return 1;
    mark[x]=1;
    ++c;
    S[c]=x;
    int siz=G[x].size();
    for(int i=0;i<siz;++i)
        if(!dfs(G[x][i]))return 0;
    return 1;
}
int solve(int m)
{
    for(int i=0;i<m*2;i+=2){
        if(!mark[i]&&!mark[i+1])
        {
            c=0;
            if(!dfs(i))
            {
                while(c>0)
                {
                    mark[S[c]]=0;
                    c-=1;
                }
                if(!dfs(i+1))return 0;
            }
        }
    }
    return 1;
}
int main(){
    int n,m;
    scanf("%d %d",&n,&m);
    for(int i=0;i<m;++i){
        int a,b;
        scanf("%d%d",&a,&b);
        from[i]=min(a,b);
        to[i]=max(a,b);
    }
    build(m);
    if(solve(m))printf("panda is telling the truth...");
    else printf("the evil panda is lying again");
    return 0;
}
优质内容筛选与推荐>>
1、Java连接Oracle代码
2、pfx格式密钥库修改密码
3、下一步
4、零基础学python-2.12 循环while语句
5、MySQL的ibdata1文件占用过大


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号