局域网(信息学奥赛一本通-T1391)
生活随笔
收集整理的這篇文章主要介紹了
局域网(信息学奥赛一本通-T1391)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目描述】
某個局域網內有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<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<string> #include<cstdlib> #include<queue> #include<set> #include<map> #include<stack> #include<vector> #define INF 0x3f3f3f3f #define PI acos(-1.0) #define N 1001 #define MOD 123 #define E 1e-6 using namespace std; int father[N]; struct Node{int a;int b;int w; }g[N*N]; void quick_sort(int left,int right) {int i=left,j=right;int mid=g[(left+right)/2].w;while(i<=j){while(g[i].w<mid)i++;while(g[j].w>mid)j--;if(i<=j){swap(g[i],g[j]);i++;j--;}}if(i<right)quick_sort(i,right);if(left<j)quick_sort(left,j); } int Find(int x) {if(father[x]==x)return x;return father[x]=Find(father[x]); } int Union(int x,int y) {x=Find(x);y=Find(y);if(x!=y){father[y]=x;return 1;}return 0; } int main() {int n,k;cin>>n>>k;for(int i=1;i<=n;i++)father[i]=i;for(int i=1;i<=k;i++)cin>>g[i].a>>g[i].b>>g[i].w;int sum=0;quick_sort(1,k);for(int i=1;i<=k;i++)sum+=g[i].w;int cnt=0,ans=0;for(int i=1;i<=k;i++)if(Union(g[i].a,g[i].b)){ans+=g[i].w;cnt++;if(cnt==n-1)break;}cout<<sum-ans<<endl;return 0; }?
總結
以上是生活随笔為你收集整理的局域网(信息学奥赛一本通-T1391)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 释放囚犯(洛谷-P1622)
- 下一篇: 训练日志 2018.10.18