第三部分 數據結構 --第四章 圖論算法1391:局域網(net)

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章