題意:對n個人進行排名,給定兩個人a、b,a>b a=b a做法:將等於關係的放入乙個集合中,對每個集合的根進行拓撲排序,發現有多種排序結果為uncertain 有環為conflict
#include
#include
#include
#include
#include
using
namespacestd;
const
intmaxn=10005;
const
intmaxm=20005;
intn,m,f[maxn],x[maxm],y[maxm],son[maxn];
charope[maxm];
vector
<int> g[maxn];
void initset(intn)
for(inti=0;i<=n;i++)f[i]=i;
for(inti=0;i<=n;i++)g[i].clear();
memset(son,0,sizeof(son));
int find(intx)
returnx==f[x]?f[x]:f[x]=find(f[x]);
bool union(intx,inty)
inta=find(x),b=find(y);
if(a==b)return
false;
if(a>b)f[b]=a;
else
f[a]=b;
return
true;
int main()
while(scanf("%d %d",&n,&m)!=eof)
initset(n);
intnum=n;
for(inti=0;iscanf("%d %c %d",&x[i],&ope[i],&y[i]);
if(ope[i]=='=')
if(union(x[i],y[i]))num--;
for(inti=0;iif(ope[i]!='=')
intxx=find(x[i]),yy=find(y[i]);
if(ope[i]=='>')
g[xx].push_back(yy);
son[yy]++;
else
g[yy].push_back(xx);
son[xx]++;
queue
<int> q;
for(inti=0;iif(son[i]==0&&i==find(i))q.push(i);
intstan=0;
while(!q.empty())
if(q.size()>1)stan=1;
intt=q.front();
q.pop();
--num;
for(intv=0;vt].size();++v)
if(--son[g[t][v]]==0)q.push(g[t][v]);
// cout<<"?????????"<
if(num>0)cout<<"conflict"
<<endl;
else
if(stan==1)cout<<"uncertain"
<<endl;
elsecout<<"ok"
<<endl;
return0;
hdu1811 並查集 拓撲排序
description 自從lele開發了rating系統,他的tetris事業更是如虎添翼,不久他遍把這個遊戲推向了全球。為了更好的符合那些愛好者的喜好,lele又想了乙個新點子 他將製作乙個全球tetris高手排行榜,定時更新,名堂要比富比士富豪榜還響。關於如何排名,這個不用說都知道是根據rat...
hdu1811 並查集 拓撲排序
題目大意 有n個點 編號0 n 1 有m個關係,或者 若這n個點能形成固定的鏈式大小關係,就輸出 ok 如果關係有衝突,則輸出 conflict 如果關係不全,則輸出 uncertain ps 坑點,conflict 優先於 uncertain 所以判斷到 uncertain 條件時,別急著輸出 u...
HDU 1811 並查集 拓撲排序
題目鏈結 rank of tetris 我們先處理 的情況,把相等關係的兩個數字合併,最終只用他們的根來代表他們。然後再處理 的情況,我們需要先找到每個數字的根,再進行邊的連線。我們還需要記錄縮點後最終有幾個數字,以及進行topo的時候,放進佇列的條件是in 0 find i i 因為有些數字沒有邊...