hdu1811 並查集 拓撲排序

2021-08-20 21:28:52 字數 1335 閱讀 3429

題目大意:有n個點(編號0~n-1),有m個關係,「>」、「<」或者「=」。若這n個點能形成固定的鏈式大小關係,就輸出」ok」,如果關係有衝突,則輸出」conflict」,如果關係不全,則輸出」uncertain」。ps:坑點,」conflict」優先於」uncertain」,所以判斷到」uncertain」條件時,別急著輸出」uncertain」,而是置乙個」uncertain」的flag,等到最後先判斷」conflict」的條件,再判斷」uncertain」的條件。

將有「=」關係的點merge在一起,作為乙個點,然後進行拓撲排序

#include 

#include

#include

using

namespace

std;

const

int maxn = 10010;

const

int maxm = 20010;

int head[maxn];

int to[maxm], nxt[maxm], tot;

int fa[maxn], in[maxm];

bool vis[maxn];

int n, m;

int findfa(int x)

void merge_(int u, int v)

void addedge(int u, int v)

int topo_solve(int sum)

bool flag = 0;

while(!q.empty())

}if(sum > 0) return

0; if(flag) return

2; return1;}

int main()

tot = 0;

int sum = n;

int u[maxm], v[maxm];

char ch[maxm];

for(int i = 0; i < m ; ++i)

}bool flag = 0;

for(int i = 0; i < m; ++i)

if(ch[i]=='<') addedge(f2, f1);

else addedge(f1, f2);

}if(flag) continue;

int tag = topo_solve(sum);

if(!tag) printf("conflict\n");

else

if(tag==1) printf("ok\n");

else

printf("uncertain\n");

}return

0;}

hdu1811 並查集 拓撲排序

description 自從lele開發了rating系統,他的tetris事業更是如虎添翼,不久他遍把這個遊戲推向了全球。為了更好的符合那些愛好者的喜好,lele又想了乙個新點子 他將製作乙個全球tetris高手排行榜,定時更新,名堂要比富比士富豪榜還響。關於如何排名,這個不用說都知道是根據rat...

HDU 1811 並查集 拓撲排序

題目鏈結 rank of tetris 我們先處理 的情況,把相等關係的兩個數字合併,最終只用他們的根來代表他們。然後再處理 的情況,我們需要先找到每個數字的根,再進行邊的連線。我們還需要記錄縮點後最終有幾個數字,以及進行topo的時候,放進佇列的條件是in 0 find i i 因為有些數字沒有邊...

hdu 1811 拓撲排序 並查集判斷

拓撲排序的兩個性質 如果一次入隊入度為零的點大於1則說明拓撲排序序列不唯一 如果排序的總個數小於給定的個數,則說明存在迴路 include include include include includeusing namespace std struct node q 30000 int indeg...