局域网

题目背景

某个局域网内有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

 

分析:

这道题我觉得还是有点难度的。。。至少比团伙难吧。。。但是莫名恶意评分QAQ。。。还有本题显然是最小生成树吧。。。为什么是并查集???

 

CODE:

 

#include<cstdio>
#include<iostream>
#include<algorithm> 
using namespace std;    
int n,m,a,b,c,tot=0,v[10001],fa[10001],k[10001],num=0;
struct edge
{
    int from,to,next,data;
}e[10001];
bool cmp(const edge &a,const edge &b){
    if(a.data<b.data)return 1;
    else return 0;
}
void add(int x,int y){
    tot++;
    e[tot].from=x;
    e[tot].to=y;
    e[tot].data=c;
    e[tot].next=v[x];
    v[x]=tot;
}
int find(int x){
    if(fa[x]!=x)return fa[x]=find(fa[x]);
    return x;
}
void uni(int x,int y){
    int r1=find(x),r2=find(y);
    if(r1!=r2)fa[r2]=r1;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        cin>>a>>b>>c;
        num+=c;
        add(a,b);
        add(b,a);
    }
    for(int i=1;i<=n;i++)
    k[i]=1<<30;
    k[1]=0;
    for(int i=1;i<=n;i++)fa[i]=i;
    sort(e+1,e+tot+1,cmp);
    int sum=0,p;
    for(int i=1;i<=tot;i++){
        if(find(e[i].to)!=find(e[i].from)){
            uni(e[i].from,e[i].to);
            sum+=e[i].data;
            p++;
            if(p==n-1)break;
        }
    }
    cout<<num-sum;
    return 0;
}

 

posted @ 2019-09-24 00:40  Sword_Art_Online  阅读(231)  评论(0编辑  收藏  举报