1. 程式人生 > >洛谷 P2820 區域網(最小生成樹) 題解

洛谷 P2820 區域網(最小生成樹) 題解

題目來源:

題目描述:

題目背景

某個區域網內有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

解題思路:

       很明顯,去掉邊權和最大,使圖變成最小生成樹,那麼我們先求出最小生成樹,把總邊權和減掉最小生成樹就是答案來

程式碼:

#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <queue>
#include <stack>
#include <cmath>
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;
const int  maxn=1e5+10;
struct newt
{
    int from,to,cost;
}e[maxn];
int fa[110],n,m;
int fi(int x)
{
    if(x==fa[x])return x;
    return fa[x]=fi(fa[x]);
}
bool cmp(newt a,newt b)
{
    return a.cost<b.cost;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)fa[i]=i;
    int ans=0;
    for(int i=1;i<=m;i++)
        scanf("%d%d%d",&e[i].from,&e[i].to,&e[i].cost),ans+=e[i].cost;
    sort(e+1,e+m+1,cmp);
    for(int i=1;i<=m;i++)
    {
        int f1=fi(e[i].from),f2=fi(e[i].to);
        if(f1!=f2)
        {
            ans-=e[i].cost;
            fa[f1]=f2;
        }
    }
    printf("%d\n",ans);
    return 0;
}