某個局域網內有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; }