HDU 3072 強連通分量

2022-07-04 13:09:12 字數 1347 閱讀 1957

題目鏈結

題目大意:為乙個有向連通圖加邊。使得整個圖全連通,有重邊出現。

解題思路

先用tarjan把強連通分量縮點。

由於整個圖肯定是連通的,所以列舉每一條邊,記錄到非0這個點所在連通分量的最小cost。

一共需要累加cnt-1個連通分量的cost。

在tarjan過程中的重邊,可以用鏈式前向星結構解決。(vector鄰接表會算錯)

在列舉每條邊的cost中,用cost[i]記錄i這個連通分量的最小cost。

最後不要算上cost[scc[0]],因為0點所在的連通分量是免費的。

#include "

cstdio

"#include

"algorithm

"#include

"stack

"#include

"cstring

"using

namespace

std;

#define maxn 50005

#define ll long long

inthead[maxn],tot,pre[maxn],lowlink[maxn],sccno[maxn],dfs_clock,cnt,cost[maxn];

stack

s;struct

edge

e[100005

];void addedge(int u,int v,int

c)void tarjan(int

u)

else

if (!sccno[v]) lowlink[u]=min(lowlink[u],lowlink[v]);

}if(lowlink[u]==pre[u])

}}int

main()

for(int i=0;i)

if(!pre[i]) tarjan(i);

ll sum=0

;

for(int i=0;i)

for(int j=head[i];j!=-1;j=e[j].next)

if(sccno[i]!=sccno[e[j].to]) cost[sccno[e[j].to]]=min(cost[sccno[e[j].to]],e[j].c);

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

if(i!=sccno[0

]) sum+=cost[i];

printf(

"%i64d\n

",sum);

}}

HDU 3072 強連通分量

題目鏈結 題目大意 為乙個有向連通圖加邊。使得整個圖全連通,有重邊出現。解題思路 先用tarjan把強連通分量縮點。由於整個圖肯定是連通的,所以列舉每一條邊,記錄到非0這個點所在連通分量的最小cost。一共需要累加cnt 1個連通分量的cost。在tarjan過程中的重邊,可以用鏈式前向星結構解決。...

HDU 3072 強連通分量 topo

題意 給乙個有向圖,邊有權值。問最小的傳遞資訊代價,代價是邊的權值。乙個相互可達的頂點之間交換資訊是不需要代價的,肯定存在乙個點能把資訊傳遞到其餘所有點。思路 強連通分量 topo排序,強連通縮點以後找到入度為0的點進行topo,儲存資訊傳遞到每個新點用的最小代價即可。主要是題目描述太醜難以理解。原...

強連通縮點 hdu3072

題意 實現某確定一點向其他所有的點直接或者間接地傳遞訊息。如果某幾個點之間訊息可以互達,則不收取費用,求所有點接受到訊息所花費的最小值。連通分量內不收取費用,所以列舉找到聯通分量之間最小值。include include include includeusing namespace std defi...