洛谷 P2820 區域網(最小生成樹) 題解
阿新 • • 發佈:2019-02-11
題目來源:
題目描述:
題目背景
某個區域網內有n(n<=100)臺計算機,由於搭建區域網時工作人員的疏忽,現在區域網內的連線形成了迴路,我們知道如果區域網形成迴路那麼資料將不停的在迴路內傳輸,造成網路卡的現象。因為連線計算機的網線本身不同,所以有一些連線不是很暢通,我們用f(i,j)表示i,j之間連線的暢通程度,f(i,j)值越小表示i,j之間連線越通暢,f(i,j)為0表示i,j之間無網線連線。
題目描述
需要解決迴路問題,我們將除去一些連線,使得網路中沒有迴路,並且被除去網線的Σf(i,j)最大,請求出這個最大值。
輸入輸出格式
輸入格式:
第一行兩個正整數n k
接下來的k行每行三個正整數i j m表示i,j兩臺計算機之間有網線聯通,通暢程度為m。
輸出格式:
一個正整數,Σf(i,j)的最大值
輸入輸出樣例
輸入樣例#1: 複製
5 5 1 2 8 1 3 1 1 5 3 2 4 5 3 4 2
輸出樣例#1: 複製
8
說明
f(i,j)<=1000
解題思路:
很明顯,去掉邊權和最大,使圖變成最小生成樹,那麼我們先求出最小生成樹,把總邊權和減掉最小生成樹就是答案來
程式碼:
#include <iostream> #include <iomanip> #include <cstdio> #include <cstring> #include <string> #include <vector> #include <map> #include <algorithm> #include <queue> #include <stack> #include <cmath> #define inf 0x3f3f3f3f #define ll long long using namespace std; const int maxn=1e5+10; struct newt { int from,to,cost; }e[maxn]; int fa[110],n,m; int fi(int x) { if(x==fa[x])return x; return fa[x]=fi(fa[x]); } bool cmp(newt a,newt b) { return a.cost<b.cost; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)fa[i]=i; int ans=0; for(int i=1;i<=m;i++) scanf("%d%d%d",&e[i].from,&e[i].to,&e[i].cost),ans+=e[i].cost; sort(e+1,e+m+1,cmp); for(int i=1;i<=m;i++) { int f1=fi(e[i].from),f2=fi(e[i].to); if(f1!=f2) { ans-=e[i].cost; fa[f1]=f2; } } printf("%d\n",ans); return 0; }