SDU程式設計思維Week8 作業 C 班長競選

2021-10-23 06:25:09 字數 2131 閱讀 9314

大學班級選班長,n 個同學均可以發表意見 若意見為 a b 則表示 a 認為 b 合適,意見具有傳遞性,即 a 認為 b 合適,b 認為 c 合適,則 a 也認為 c 合適。勤勞的 tt 收集了m條意見,想要知道最高票數,並給出乙份候選人名單,即所有得票最多的同學

本題有多組資料。第一行 t 表示資料組數。每組資料開始有兩個整數 n 和 m (2 <= n <= 5000, 0 :24

3322

0213

3102

102output:

case 1:2

01case 2:2

012前提:用前向星儲存圖

這道題很綜合,屬實複雜,基本方法是前向星存圖+kosaraju求scc+dfs

整個過程中,共需要三張圖——原圖、反圖、縮點後的圖,三遍dfs,用到的變數、陣列很多所以要注意初始化以及輸出格式。

要注意n個同學的序號是0~n-1

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn =

5010

;const

int maxm =

30020

;const

int inf =

1e9;

int t, n, m, tot =

0, tot1 =

0, tot2 =

0, dcnt =

0, scnt =

0,temp=0;

int head[maxn]

,head1[maxn]

,head2[maxn]

, vis[maxn]

, dfn[maxn]

,c[maxn]

,scc[maxn]

,in_deg[maxn]

,flag[maxn]

,ans[maxn]

,maxscc[maxn]

;struct edge e1[maxm]

,e2[maxm]

,e[maxm]

;//原圖

void

add1

(int u,

int v)

//反圖

void

add2

(int u,

int v)

//縮點

void

add(

int u,

int v)

void

dfs1

(int x)

} dfn[

++dcnt]

= x;

//後序

}//在反圖中按照逆後序遍歷構成 scc

void

dfs2

(int x)

}void

kosaraju()

}//縮點圖

void

together()

}}void

dfs(

int x)

}void

init()

}int

main()

kosaraju()

;together()

;//ans = 0;

for(

int i =

1; i <= scnt; i++)}

int maxans =0;

for(

int i =

1; i <= scnt; i++)if

(maxans < ans[i]

)for

(int i =

1; i <= scnt; i++

)printf

("case %d: %d\n"

, num, maxans)

;int pos =0;

for(

int i =

1; i <= n; i++

)else cout <<

" "<< i -1;

}}cout << endl;

num++;}

}

SDU程式設計思維Week8 作業 B 貓貓向前衝

有 n 只貓貓,編號依次為1,2,3,n進行比賽。比賽結束後,up 主會為所有的貓貓從前到後依次排名並發放愛吃的小魚幹。不幸的是看不到最後的頒獎典禮。不幸中的萬幸,tt 的魔法貓將每場比賽的結果都記錄了下來,現在他想程式設計序確定字典序最小的名次序列,請你幫幫他。輸入有若干組,每組中的第一行為二個數...

程式設計思維 week8 作業C 班長競選

大學班級選班長,n 個同學均可以發表意見 若意見為 a b 則表示 a 認為 b 合適,意見具有傳遞性,即 a 認為 b 合適,b 認為 c 合適,則 a 也認為 c 合適 勤勞的 tt 收集了m條意見,想要知道最高票數,並給出乙份候選人名單,即所有得票最多的同學,你能幫幫他嗎?本題有多組資料。第一...

程式設計思維 week8 作業A 區間選點 II

給定乙個數軸上的 n 個區間,要求在數軸上選取最少的點使得第 i 個區間 ai,bi 裡至少有 ci 個點 使用差分約束系統的解法解決這道題 輸入第一行乙個整數 n 表示區間的個數,接下來的 n 行,每一行兩個用空格隔開的整數 a,b 表示區間的左右端點。1 n 50000,0 ai bi 5000...