局域网【 kruskal + 并查集】

    xiaoxiao2022-07-04  211

    题目背景

    某个局域网内有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)的最大值

    输入样例

    5 5 1 2 8 1 3 1 1 5 3 2 4 5 3 4 2

    输出样例

    8

    思路

    1. 用总的边得权值减去MST的变得权值就好了,用到了kruskal算法 #include<bits/stdc++.h> #define read() freopen("input.txt","r",stdin) #define write() freopen("output.txt","w",stdout) using namespace std; int n,m,pre[200],sum,sumall,x; struct dot{ int start,end,len; }city[20010]; bool cmp(dot a,dot b){ return a.len<b.len; } int find(int x){ return x==pre[x]?x:pre[x]=find(pre[x]); } int main(){ read(); cin>>n>>m; for( int i=1; i<=n; i++ ) pre[i]=i; for( int i=1; i<=m; i++ ){ cin>>city[i].start>>city[i].end>>city[i].len; sumall+=city[i].len; } sort(city+1,city+m+1,cmp); for( int i=1; i<=m; i++ ){ int a=find(city[i].start); int b=find(city[i].end); if(a!=b){ pre[a]=b; sum+=city[i].len; x++; if (x==n) break; } } cout<<sumall-sum; return 0; }
    最新回复(0)