1391:局域網(net)
時間限制: 1000 ms 內存限制: 65536 KB
提交數: 2551 通過數: 1588
【題目描述】
某個局域網內有n(n≤100)臺計算機,由於搭建局域網時工作人員的疏忽,現在局域網內的連接形成了迴路,我們知道如果局域網形成迴路那麼數據將不停的在迴路內傳輸,造成網絡卡的現象。因爲連接計算機的網線本身不同,所以有一些連線不是很暢通,我們用f(i,j)表示i,j之間連接的暢通程度(f(i,j)≤1000),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)的最大值。
【輸入樣例】
5 5
1 2 8
1 3 1
1 5 3
2 4 5
3 4 2
【輸出樣例】
8
思路:這題逆向思考,求最大值,那麼我們用總和減去最小值即是最大值
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
const int N = 1000;
const int M = N * N;
using namespace std;
int n,m;
struct node{
int u;
int v;
int w;
}edge[M];
bool cmp(node x, node y){
return x.w < y.w;
}
int fa[N];
inline int find(int x){
return x == fa[x]?x:fa[x] = find(fa[x]);
}
inline void un(int x, int y){
fa[x] = y ;
return;
}
int main(){
ios::sync_with_stdio(false);
cin >> n >> m;
int sum = 0;
for(register int i = 1; i <= n;i++)
fa[i] = i;
for(register int i = 1; i <= m; i++){
int u,v,w;
cin >> u >> v >> w;
edge[i] = {u,v,w};
sum += w; //求總和
}
int ans = 0;
sort(edge+1,edge+m+1,cmp);//排序
for(register int i = 1; i<=m;i++)//並查集求得最小值
{
int fx = find(edge[i].u);
int fy = find(edge[i].v);
if(fx == fy) continue;
ans += edge[i].w ;//最小值
un(fx,fy);
}
printf("%d ",sum - ans);
return 0;
}