1 HDU 1811(拓撲排序 並查集)

2021-07-16 05:14:37 字數 2745 閱讀 4385

題意:對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 因為有些數字沒有邊...