1019 集合论与图论

1019 集合论与图论
一道简单(然而我做了2h)的题目,
提了4次,最后仔细一看——MD有自环,这是闹哪样。
好生气好生气。
啊啊,
第一次——没有完全重置数据。
第二、三次——没有发现自环。(对于上一次的问题解决方案:方案一:认真一点点找需要重置的数据、方案二:定义函数)
第四次——AC。(对于上一次的问题解决方案:对于自环,把原来防止自环出现的visit数组删去了)
代码如下

#include
#include
#include
typedef struct edge{
    int to;
    int next;
}E;
int head[100000];
E a[100000];
int dfs(int begin,int num)
{
    int temp;
    int lemp;
    int flag=0;
    temp=head[num];
    lemp=head[begin];
    while(temp)
    {
        flag=0;
        while(lemp)
        {
            if(a[lemp].to==a[temp].to)
            {
                flag=1;
                break;
            }
            lemp=a[lemp].next;
        }
        if(flag==0)
        return 0;
        temp=a[temp].next;
    }
    return 1;
}
int main()
{
    int T;
    int N,M;
    int i;
    int u,v,temp;
    int flag=1;
    scanf("%d",&T);
    while(T--)
    {   
        flag=1;
        scanf("%d %d",&N,&M);
        memset(head,0,sizeof(head));
        for(i=1;i<=100000;i++)//要手动置零 
        {
            a[i].to=0;
            a[i].next=0;
        }
        for(i=1;i<=M;i++)
        {
            scanf("%d %d",&u,&v);
            a[i].to=v;
            a[i].next=head[u];
            head[u]=i;
        }
        for(i=1;i<=N;i++)
        {
            temp=head[i];
            while(temp)
            {
                if(dfs(i,a[temp].to))
                temp=a[temp].next;
                else
                {
                    flag=0;
                    break;
                }
            }
            if(flag==0)
            break;
        }
        if(flag)
        printf("Yes\n");
        else
        printf("No\n");
    }
    return 0;
}

你可能感兴趣的:(NOI刷题路)