大學班級選班長,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...