拓撲排序題集

2021-09-11 15:09:13 字數 2879 閱讀 8033

hdu - 5438

題意:有n個池塘和m個管道;每個池塘的價值是v, 現在由於資金問題要刪除池塘;但是刪除的池塘必須是最多隻連線乙個管道,否則會**;管子會因為池塘的刪除而消失

求最後相連的池塘有奇數個的價值總和是多少

解析:建立無向圖

先用拓撲排序刪除入度為1的所以池塘並標記,然後再用深搜判斷是否是奇數連通

ac:

#include#define ll long long

#define maxn 100005

using namespace std;

int w[maxn],in[maxn];

int to[maxn<<2],next1[maxn<<2],head[maxn<<2];

int tot,n,m;

int vis[maxn];

void init()

}}ll ans=0,num=0,sum=0;

void dfs(int x)

}int main()

topo();

ans=0;

for(int i=1;i<=n;i++)

}printf("%lld\n",ans);

}return 0;

}

d. gourmet choice

鏈結:d - gourmet choice

題意:給兩個陣列,長度分別為n,m.給兩個陣列的關係

構造出最小的兩個陣列,如果無法構造,輸出no,否則yes,輸出兩個陣列

解析:並查集(縮點)+拓撲排序

首先要判斷是否有環,有環no

對與"=",我們把它合成乙個點,用並查集

用拓撲排序判斷是否有環和構造陣列

ac:

#include#define rep(i,a,b) for(int i=a;i<=b;i++)

#define per(i,a,b) for(int i=a;i>=b;i--)

#define io ios_base::sync_with_stdio(false);cin.tie(null);cout.tie(null);

#define ll long long

#define maxn 5005

using namespace std;

char str[1010][1010]=;

int f[maxn];

int in[maxn]=;

vectormp[maxn];

int reward[maxn]=;

int n,m;

void init()

int find(int x)

void unite(ll a,ll b)

void topo()

int count=0;

while(!que.empty())

else

}topo();

return 0;

}

題意:有乙個字串,把所以字元的關係給你,讓你輸出這個字元,如果不存在這個字元,輸出-1

解析:這裡每種字母最多10000個,我們直接把不同的字母構成分別村好,每種字母前後差10000

然後就是常規操作

ac:

#include#define maxn 300005

using namespace std;

char s[maxn]=;

int in[maxn]=;

int vis[maxn]=;

int c[maxn]=;

int num[30];//26個字母的數目

vectorvc[maxn];//記錄邊

int ans[maxn]=;

void topo(int n)

int num=0;

while(que.size())

;int n;

int in[maxn],vis[maxn]=;

void add(int u,int v)

void topo()

}}}

int main()}}

topo();

ll ans=0;

for(int i=1;i<=n;i++)

printf("%lld\n",ans);

return 0;

}

法2:

解析:o(n)複雜度

根據性質:

在乙個集合中,不能存在乙個技能只有乙個人會的情況

=> 首先我們選擇一些元素,這些元素的a[i]相同,我們選擇一些a[i]相同的元素加入集合,如果所以a[i]都唯一,呢麼集合為空

-> 我們選擇這些包含相同a[i]的,然後選擇一些a[i]包含在呢些集合中的

集合中有:11100*2,000111*2,

可以選擇10100,000110,會的技能被任一元素的a[i]包含,不能選擇001100,不能被單獨乙個包含

用|運算可以快速取得結果, a[i]|v[i]==v[i],a[i]被v[i]包含,a[i]會的v[i]都會

ac:

#include#define ll long long

#define maxn 10005

using namespace std;

struct node

sort(ee+1,ee+n+1);

for(ll i=1;i<=n;i++)

set::iterator it;

ll ans=0;

for(it=st.begin();it!=st.end();it++)}}

printf("%lld\n",ans);

return 0;

}

拓撲排序基礎題 排序

題目 由於公司在2013年的銷售業務成績優秀,公司總經理心情大好,決定給每位員工發獎金。公司決定以每個人本年在公司的貢獻為標準來計算他們得到獎金的多少。於是總經理下令召開 m 方會談。每位參加會談的代表提出了自己的意見 我認為員工 a 的獎金應該比 b 高!總經理決定要找出一種獎金方案,滿足各位代表...

hdu 拓撲排序 並查集

題目大意 有一些池塘,每乙個池塘都有乙個價值,現在想刪除一些池塘。有如下刪除條件 1 乙個池塘有兩個管道連線的不可以刪除。2 求最後剩下的為奇數環的池塘的價值。先用拓撲排序的思路將兩個一下連線的全刪除 只有用並查集統計數目 includeusing namespace std define ll l...

Rank of Tetris 拓撲排序 並查集

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