题目:点击打开链接
代码:
#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>