zoukankan      html  css  js  c++  java
  • (2 sat) hdu 1824

    Let's go home

    Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 1523    Accepted Submission(s): 616


    Problem Description
    小时候,乡愁是一枚小小的邮票,我在这头,母亲在那头。
                            —— 余光中

    集训是辛苦的,道路是坎坷的,休息还是必须的。经过一段时间的训练,lcy决定让大家回家放松一下,但是训练还是得照常进行,lcy想出了如下回家规定,每一个队(三人一队)或者队长留下或者其余两名队员同时留下;每一对队员,如果队员A留下,则队员B必须回家休息下,或者B留下,A回家。由于今年集训队人数突破往年同期最高记录,管理难度相当大,lcy也不知道自己的决定是否可行,所以这个难题就交给你了,呵呵,好处嘛~,免费**漂流一日。
     
    Input
    第一行有两个整数,T和M,1<=T<=1000表示队伍数,1<=M<=5000表示对数。
    接下来有T行,每行三个整数,表示一个队的队员编号,第一个队员就是该队队长。
    然后有M行,每行两个整数,表示一对队员的编号。
    每个队员只属于一个队。队员编号从0开始。
     
    Output
    可行输出yes,否则输出no,以EOF为结束。
     
    Sample Input
    1 2 0 1 2 0 1 1 2 2 4 0 1 2 3 4 5 0 3 0 4 1 3 1 4
     
    Sample Output
    yes no
     
    Author
    威士忌
     
    Source
     
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<cstdlib>
    #include<algorithm>
    #include<queue>
    #include<stack>
    #include<set>
    #include<map>
    using namespace std;
    stack<int> s;
    vector<int> e[7010];
    int n,m,Dfs[7010],use[7010],low[7010],isstack[7010];
    int top,newflag;
    void init()
    {
        memset(Dfs,0,sizeof(Dfs));
        memset(use,0,sizeof(use));
        memset(low,0,sizeof(low));
        memset(isstack,0,sizeof(isstack));
        top=0,newflag=0;
        for(int i=1;i<=6*n;i++)
            e[i].clear();
        while(!s.empty())
            s.pop();
    }
    void tarjan(int u)
    {
        Dfs[u]=low[u]=++top;
        isstack[u]=1;
        s.push(u);
        for(int i=0;i<e[u].size();i++)
        {
            int v=e[u][i];
            if(!Dfs[v])
            {
                tarjan(v);
                low[u]=min(low[u],low[v]);
            }
            else if(isstack[v])
                low[u]=min(low[u],Dfs[v]);
        }
        if(Dfs[u]==low[u])
        {
            newflag++;
            int x;
            do
            {
                x=s.top();
                s.pop();
                isstack[x]=0;
                use[x]=newflag;
            }while(x!=u);
        }
    }
    int main()
    {
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            init();
            for(int i=1;i<=n;i++)
            {
                int a,b,c;
                scanf("%d%d%d",&a,&b,&c);
                a++,b++,c++;
                e[a+3*n].push_back(b);
                e[a+3*n].push_back(c);
                e[b+3*n].push_back(a);
                e[c+3*n].push_back(a);
            }
            for(int i=1;i<=m;i++)
            {
                int a,b;
                scanf("%d%d",&a,&b);
                a++,b++;
                e[a].push_back(b+3*n);
                e[b].push_back(a+3*n);
            }
            for(int i=1;i<=6*n;i++)
            {
                if(!Dfs[i])
                    tarjan(i);
            }
            bool flag=true;
            for(int i=1;i<=6*n;i++)
            {
                if(use[i]==use[i+n])
                {
                    flag=false;
                    break;
                }
            }
            if(flag)
                printf("yes
    ");
            else
                printf("no
    ");
        }
        return 0;
    }
    

      

  • 相关阅读:
    ubuntu配置bonding 武汉
    桌面图标加载与存储
    launcher 图标删除分析
    Inflater
    Android屏幕元素层次结构
    简述Android触摸屏手势识别
    RelativeLayout && inflate
    manifest分析
    vacantcell缓存分析
    桌面快捷键和桌面livefolder
  • 原文地址:https://www.cnblogs.com/water-full/p/4531578.html
Copyright © 2011-2022 走看看