(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\n");
        else
            printf("no\n");
    }
    return 0;
}

  

posted @ 2015-05-26 19:47  waterfull  阅读(151)  评论(0编辑  收藏  举报