題目鏈結:
題目大意:為乙個有向連通圖加邊。使得整個圖全連通,有重邊出現。
解題思路:
先用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...