并查集加拓扑排序

题目:点击打开链接

代码:

#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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值