題意
大學班級選班長,n 個同學均可以發表意見 若意見為 a b 則表示 a 認為 b 合適,意見具有傳遞性,即 a 認為 b 合適,b 認為 c 合適,則 a 也認為 c 合適 勤勞的 tt 收集了m條意見,想要知道最高票數,並給出乙份候選人名單,即所有得票最多的同學,你能幫幫他嗎?
input
本題有多組資料。第一行 t 表示資料組數。每組資料開始有兩個整數 n 和 m (2 <= n <= 5000, 0output
對於每組資料,第一行輸出 「case x: 」,x 表示資料的編號,從1開始,緊跟著是最高的票數。 接下來一行輸出得票最多的同學的編號,用空格隔開,不忽略行末空格!
sample input
24 3
3 22 0
2 13 3
1 02 1
0 2sample output
case 1: 2
0 1case 2: 2
0 1 2
解題思路
我們可以知道,1投票給2,2投票給3,那麼3得到了2票。
所以乙個連通分量裡面的所有點的票數都是相同的。
所以我們可以把連通分量壓縮成點,然後可以知道 : 最大票數的點肯定在出度為0的點上,如果我們把壓點後的圖給求個反圖,那麼就是入度為0的點裡存在最大的票。
強連通分量(scc)
利用kosaraju演算法求scc
壓點後求反圖,然後計算最大票數
kosaraju演算法: dfs1次求逆後序序列,根據逆後序序列dfs遍歷染色scc。
**實現
#include
#include
#include
#define nmax 5005
#include
using
namespace std;
vector<
int> g1[nmax]
, g2[nmax]
, g3[nmax]
;//g1--原圖 g2--反圖 g3--scc的反圖
int n, m, a, b;
bool vis[nmax]
;int scc_size;
//scc的個數
int c[nmax]
;//該點屬於哪個scc
int reder;
//染色scc
int dfn[nmax]
;//記錄序列
int dfni;
//索引
int sum[nmax]
;//入度為0 的scc的票數
int degree[nmax]
;//入度
bool g3vis[nmax]
[nmax]
;//g3存反圖時避免重複存入 / 標記
struct scc
;//縮點
scc scc[nmax]
;void
add(
int u,
int v,
int g)
//g=1時加g1,g==2時加g2 ,g==3時加g3
void
dfs1
(int x)
//求後序列
void
dfs2
(int x)
//遍歷逆後序列
void
buildg()
//構造圖
}void
ini(
)//初始化
for(
int i =
0; i <= scc_size; i++
) dfni =0;
reder =0;
scc_size=0;
}void
kosaraju()
//dfs 逆後序 ,得到scc
for(
int i = n-
1; i >=
0; i--)if
(c[dfn[i]]==
0)++reder,
dfs2
(dfn[i]);
//reder染色scc
}void
suodian_and_g3()
//縮點和建立g3}}
}}//scc求反圖是為了這裡好求票數
intdfs3
(int x)
//求第i個scc的票數
return ans;
}int
main()
}int smax =0;
for(
int i =
1; i <= scc_size; i++
)//找出最大的
int res[nmax]
;//答案
int resi =0;
for(
int i =
1; i <= scc_size; i++)}
}sort
(res, res + resi)
;printf
("case %d: %d\n"
,count,smax)
;printf
("%d"
,res[0]
);for(
int i =
1; i < resi; i++
)printf
("\n");
ini();
}return0;
}
小結kosaraju演算法是乙個很精妙的演算法,2遍dfs可以求出不同顏色的scc,然後把scc壓點,取壓點後的圖的反圖,便於dfs3求得sum,然後把最大的壓點scc,提取出來他的點,排序後輸出。 kosaraju 班長競選
大學班級選班長,n 個同學均可以發表意見 若意見為 a b 則表示 a 認為 b 合適,意見具有傳遞性,即 a 認為 b 合適,b 認為 c 合適,則 a 也認為 c 合適 勤勞的 tt 收集了m條意見,想要知道最高票數,並給出乙份候選人名單,即所有得票最多的同學,你能幫幫他嗎?本題有多組資料。第一...
Kosaraju模板題 班長競選
大學班級選班長,n 個同學均可以發表意見 若意見為 a b 則表示 a 認為 b 合適,意見具有傳遞性,即 a 認為 b 合適,b 認為 c 合適,則 a 也認為 c 合適 勤勞的 tt 收集了m條意見,想要知道最高票數,並給出乙份候選人名單,即所有得票最多的同學,你能幫幫他嗎?輸入 本題有多組資料...
班長競選(kosaraju縮點
大學班級選班長,n 個同學均可以發表意見 若意見為 a b 則表示 a 認為 b 合適,意見具有傳遞性,即 a 認為 b 合適,b 認為 c 合適,則 a 也認為 c 合適 勤勞的 tt 收集了m條意見,想要知道最高票數,並給出乙份候選人名單,即所有得票最多的同學,你能幫幫他嗎?本題有多組資料。第一...