现在的位置: 首页 > 综合 > 正文

hdu1269

2013年10月22日 ⁄ 综合 ⁄ 共 1137字 ⁄ 字号 评论关闭

/*
分析:
    果的Tarjan。
    考虑了n==0和m==0要特殊处理,但是没有考虑n==1,
囧~~~,1WA。。。

                                              2012-10-24
*/

#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"queue"
using namespace std;
int stack[10011],tot_s,index_s;
int instack[10011];
int DFN[10011],LOW[10011];
struct Eage
{
    int from,to;
    int next;
}eage[100111];
int tot,head[10011];
void add(int a,int b)
{
    eage[tot].from=a;
    eage[tot].to=b;
    eage[tot].next=head[a];
    head[a]=tot++;
}
int ans;
void Tarjan(int k)
{
    int j,v;
    if(ans) return ;
    stack[tot_s++]=k;
    instack[k]=1;
    DFN[k]=LOW[k]=index_s++;
    for(j=head[k];j!=-1;j=eage[j].next)
    {
        v=eage[j].to;
        if(instack[v])  LOW[k]=LOW[k]>DFN[v]?DFN[v]:LOW[k];
        else
        {
            Tarjan(v);
			if(ans)	return ;
            LOW[k]=LOW[k]=LOW[k]>LOW[v]?LOW[v]:LOW[k];
        }
    }
    if(DFN[k]==LOW[k])
    {
        do
        {
            ans++;
            instack[stack[--tot_s]]=0;
        }while(stack[tot_s]!=k);
    }
}
int main()
{
    int n,m;
    int i;
    int a,b;
    while(scanf("%d%d",&n,&m),n||m)
    {
        tot=0;
        memset(head,-1,sizeof(head));
        while(m--)  {scanf("%d%d",&a,&b);add(a,b);}

        if(n<=1)    {printf("Yes\n");continue;}
        if(m==0)    {printf("No\n");continue;}

        tot_s=0;
        index_s=1;
        memset(instack,0,sizeof(instack));
        memset(DFN,-1,sizeof(DFN));
        memset(LOW,-1,sizeof(LOW));
        ans=0;
        Tarjan(1);
        if(ans==n)  printf("Yes\n");
        else        printf("No\n");
    }
    return 0;
}

抱歉!评论已关闭.