這題很考驗代碼能力,小弟不才,寫了200+行還是wa,後來看人家的代碼,vector的用法,今天學習了,寫下報告記錄下vector的用法,解法很簡單,把集合縮成一個點,然後拓撲排序,集合用的是並查集。
Run ID | Submit Time | Judge Status | Pro.ID | Exe.Time | Exe.Memory | Code Len. | Language | Author |
5237456 | 2012-01-08 21:25:28 | Accepted | 1811 | 15MS | 656K | 1833 B | C++ | xym2010 |
#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
struct edge
{
int x,y;
char ch;
}eg[20005];
int fa[10005],in[10005],n,m,pos;
vector< int > vct[10005];
int Find(int x)
{
return x==fa[x]?x:fa[x]=Find(fa[x]);
}
void unin(int x,int y)
{
int a=Find(x);
int b=Find(y);
fa[a]=b;
}
void init()
{
for(int i=0;i<n;i++)
fa[i]=i,vct[i].clear(),in[i]=0;
}
int top()
{
int ok=0;
queue< int >q;
for(int i=0;i<n;i++)
{
if(Find(i)==i&&in[i]==0)
q.push(i);
}
while(!q.empty())
{
if(q.size()>=2)
ok=-1;
int x=q.front();
q.pop();pos--;
for(int i=0;i<vct[x].size();i++)
{
if(in[vct[x][i]]>0)
in[vct[x][i]]--;
if(in[vct[x][i]]==0)
q.push(vct[x][i]);
}
}
if(pos>0)return 1;
return ok;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
init();
int flag1=0,flag2=0;pos=n;
for(int i=0;i<m;i++)
{
scanf("%d %c %d",&eg[i].x,&eg[i].ch,&eg[i].y);
if(eg[i].ch=='=')
unin(eg[i].x,eg[i].y),pos--;
}
for(int i=0;i<m;i++)
{
if(eg[i].ch=='=')
continue;
int x,y;
x=Find(eg[i].x);y=Find(eg[i].y);
if(x==y)
flag1=1;
if(eg[i].ch=='<')
{
if(find(vct[x].begin(),vct[x].end(),y)==vct[x].end())
{
vct[x].push_back(y);
in[y]++;
}
}
else
{
if(find(vct[y].begin(),vct[y].end(),x)==vct[y].end())
{
vct[y].push_back(x);
in[x]++;
}
}
}
if(!flag1)
{
int tem=top();
if(tem==1)flag1=1;
else if(tem==-1)flag2=1;
}
if(flag1==1)
printf("CONFLICT\n");
else if(flag2==1)
printf("UNCERTAIN\n");
else printf("OK\n");
}
return 0;
}