HDU4324Triangle LOVE

来源:互联网 发布:桌面数字时钟软件 编辑:程序博客网 时间:2024/05/23 11:56

这道题其实就是一道拓扑排序的模板题,只要有环就证明存在三角关系,代码如下

#include <iostream>#include <string.h>#include <stdio.h>#include <queue>using namespace std;const int N=2005;bool vis[N];int head[N],degree[N];int q[N],cnt,num;struct edgenode{    int  to,next;} edge[N*N];//这里一定要注意,把数组开大,开到N*N,非常神奇的是我TLE了一下午,居然不是REvoid init()//初始化{    cnt=0;    memset(vis,false,sizeof(vis));    memset(head,-1,sizeof(head));    memset(degree,0,sizeof(degree));}void add(int u,int v)//加边{    degree[v]++;    edge[cnt].to=v;    edge[cnt].next=head[u];    head[u]=cnt++;}bool topu(int n)//拓扑排序模板{    queue<int>q;    num=0;    for(int i=0; i<n; i++)    {        if(!degree[i])            {                q.push(i);                num++;            }    }    while(!q.empty())    {        int t=q.front();        q.pop();        for(int k=head[t]; k!=-1; k=edge[k].next)        {            degree[edge[k].to]--;            if(!degree[edge[k].to])                {                    q.push(edge[k].to);                    num++;                }        }    }    return num==n;}int main(){    int T,n,case2=1;    scanf("%d",&T);    char s[2005];    while(T--)    {        bool flag=0;        scanf("%d",&n);        init();        for(int i=0; i<n; i++)//这里不能单个字符输入,否则也会TLE        {            scanf("%s",s);            for(int j=0; j<n; j++)            {                if(s[j]=='1')                {                    add(i,j);                }            }        }        flag=topu(n);        if(flag)        {            printf("Case #%d: ",case2++);            printf("No\n");        }        else        {            printf("Case #%d: ",case2++);            printf("Yes\n");        }    }    return 0;}
0 0
原创粉丝点击