并查集加拓扑排序

来源:互联网 发布:dlna软件下载 编辑:程序博客网 时间:2024/05/30 05:15

题目:点击打开链接

代码:

#include<stdio.h>//#include<bits/stdc++.h>#include<vector>#include<queue>#include<string.h>using namespace std;vector<int>q[10010];queue<int>q5;int f[10010];struct  qq{    int l,r;} e[20000];int zhaozuxian(int a){    if(f[a]==a)        return a;    else    {        f[a]=zhaozuxian(f[a]);        return f[a];    }}int  merge1(int a,int b ){    int t1,t2;    t1=zhaozuxian(a);    t2=zhaozuxian(b);    if(t1!=t2)    {        f[t2]=t1;        return 1;    }    else        return 0;}int rudu[10010];int main(){    int n,m;    char  a[100];    while(~scanf("%d%d",&n,&m))    {        getchar();        for(int i=0; i<n; i++)        {            f[i]=i;            q[i].clear();            rudu[i]=0;        }        //        memset(f,0,sizeof(0));        int h=0;        int sum=n;        int t1,t3;        char  t2;        while(m--)        {            scanf("%d %c %d",&t1,&t2,&t3);            if(t2=='>')            {                e[h].l=t3;                e[h].r=t1;                ++h;            }            else  if(t2=='<')            {                e[h].l=t1;                e[h].r=t3;                ++h;            }            else            {                if(merge1(t1,t3))                    sum--;            }        }//        printf("%d\n",sum);        for(int k=0; k<h; k++)        {            q[zhaozuxian(e[k].l)].push_back(zhaozuxian(e[k].r));            rudu[zhaozuxian(e[k].r)]++;        }        for(int i=0; i<n; i++)        {            if(rudu[i]==0&&zhaozuxian(i)==i)                q5.push(i);        }        int flag=0;        while(!q5.empty())        {            int y=q5.front();            if(q5.size()!=1)            {                flag=1;            }            q5.pop();            sum--;            for(int i=0; i<(int )q[y].size(); i++)                if(--rudu[q[y][i]]==0)                    q5.push(q[y][i]);        }//        printf("%d\n",sum);        if(sum>0) printf("CONFLICT");        else  if(flag==1)            printf("UNCERTAIN");        else            printf("OK");        printf("\n");    }    return 0;}
这个题目就是一个拓扑排序加一个并查集,但是wrong了好多回,原因是输入,我不了解gets,所以才这么苦逼,真是太弱了,
贴一个小的知识点:<span style="font-family: 微软雅黑, 'MS Sans Serif', sans-serif; widows: auto; background-color: rgb(255, 237, 196);">gets() </span><span style="font-family: 微软雅黑, 'MS Sans Serif', sans-serif; widows: auto; background-color: rgb(255, 237, 196);">和scanf()的区别在于输入的字符串是否中间有空格:对于前者,只有遇到"\n"时才停止输入,而对于后者,出现"\n"或空格都停止输入。</span>
<span style="font-family: 微软雅黑, 'MS Sans Serif', sans-serif; widows: auto; background-color: rgb(255, 237, 196);">另外这个题也巩固了我的并查集,提升了一下拓扑,还好啊。</span>

0 0