最小生成樹——局域網

題目背景

某個局域網內有n(n<=100)臺計算機,因爲搭建局域網時工做人員的疏忽,如今局域網內的鏈接造成了迴路,咱們知道若是局域網造成迴路那麼數據將不停的在迴路內傳輸,形成網絡卡的現象。由於鏈接計算機的網線自己不一樣,因此有一些連線不是很暢通,咱們用f(i,j)表示i,j之間鏈接的暢通程度,f(i,j)值越小表示i,j之間鏈接越通暢,f(i,j)爲0表示i,j之間無網線鏈接。ios

題目描述

須要解決迴路問題,咱們將除去一些連線,使得網絡中沒有迴路,而且被除去網線的Σf(i,j)最大,請求出這個最大值。算法

輸入格式:網絡

第一行兩個正整數n kspa

接下來的k行每行三個正整數i j m表示i,j兩臺計算機之間有網線聯通,通暢程度爲m。code

輸出格式:blog

一個正整數,Σf(i,j)的最大值ci

 

一道很是很是很是裸的同時又是很是基礎的最小生成樹的題,直接用prim算法。先求出總的權值的和,而後用prim累加最小權值和,前者減去後者就是最大值。string

代碼奉上:io

#include<cstdio>
#include<iostream> 
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
int a,b,c,i,j,k,l,m,n,inf=9999999,sum,max1;
int e[101][101],minn[101];
bool u[101];
int main()
{
    cin>>n>>m;
    for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
    if(i==j)
    e[i][j]=0;
    else
    e[i][j]=inf;//構造鄰接矩陣 
    for(i=1;i<=m;i++)
    {
        cin>>a>>b>>c;
        e[a][b]=e[b][a]=c;
        max1+=c;//max儲存全部的暢通程度 
}//讀入數據並存入矩陣
    memset(minn,0x7f,sizeof(minn));
    minn[1]=0;    
    memset(u,1,sizeof(u));//初始化爲True,表示全部點未被訪問 
    for(i=1;i<=n;i++)
    {
        k=0;
        for(j=1;j<=n;j++)//尋找一個與已訪問的點相連的權值最小的未被訪問的點k 
        if(u[j] && minn[j]<minn[k])
        k=j;
        u[k]=false;//將k加入最小生成樹,標記已訪問 
        for(j=1;j<=n;j++)//修改與k相連的全部未被訪問的點 
        if(u[j] && e[k][j]<minn[j])
        minn[j]=e[k][j];
    }
    for(i=1;i<=n;i++)
    sum+=minn[i];//累加權值 
    cout<<max1-sum;
    return 0;
}
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息