图结构练习——最小生成树
題目描述
?有n個城市,其中有些城市之間可以修建公路,修建不同的公路費用是不同的。現在我們想知道,最少花多少錢修公路可以將所有的城市連在一起,使在任意一城市出發,可以到達其他任意的城市。 ?輸入
?輸入包含多組數據,格式如下。 第一行包括兩個整數n m,代表城市個數和可以修建的公路個數。(n <= 100, m <=10000) 剩下m行每行3個正整數a b c,代表城市a 和城市b之間可以修建一條公路,代價為c。 ?輸出
?每組輸出占一行,僅輸出最小花費。示例輸入
3 2 1 2 1 1 3 1 1 0示例輸出
2 0提示
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#define INF 0x3f3f3f3f
using namespace std;
int arr[110][110];//記錄頂點之間的弧關系;
int dis[110];//用來記錄當前生成樹到每個節點的距離(權值);
bool vis[110];//標記數組
int prim(int n)//生成最小樹,求最小權值;
{
? ? memset(vis,false,sizeof(vis));//標記數組清零
? ? for(int i=1;i<=n;i++)
? ? ? ? dis[i]=arr[1][i];;//從1號節點開始生成樹
? ? int ans=0;//距離權值總和
? ? vis[1]=true;//生成樹的根(起點)標記訪問過
? ? for(int i=2;i<=n;i++)//要生成n-1條邊,所以循環n-1次
? ? {
? ? ? ? int pos=i;//用來記錄每一次循環找到的結點編號
? ? ? ? int min=INF;;//標記為無窮大
? ? ? ? for(int j=1;j<=n;j++)//對dis數組進行遍歷找到距離最小的
? ? ? ? ? ? if(vis[j]==false&&dis[j]<min)
? ? ? ? {
? ? ? ? ? ? min=dis[j];//更新最小距離
? ? ? ? ? ? pos=j;//記錄節點編號
? ? ? ? }
? ? ? ? ans+=min;//加上找到的最小權值
? ? ? ? vis[pos]=true;//標記找到的該點被訪問
? ? ? ? for(int j=1;j<=n;j++)//更新dis數組
? ? ? ? ? ? if(vis[j]==false&&dis[j]>arr[pos][j])//路徑通過中間路徑pos使路徑更小。
? ? ? ? ? ? ? dis[j]=arr[pos][j];//更新生成樹到該點的距離
? ? }
? ? return ans;
}
int main()
{
? ? int n,m;
? ? while(~scanf("%d%d",&n,&m))
? ? {
? ? ? ? for(int i=1;i<=n;i++)
? ? ? ? ? ? for(int j=1;j<=n;j++)//邊的初始化;
? ? ? ? {
? ? ? ? ? ? if(i==j)
? ? ? ? ? ? ? ? arr[i][j]=0;
? ? ? ? ? ? else
? ? ? ? ? ? ? ? arr[i][j]=INF;//無窮大;
? ? ? ? }
? ? ? ? for(int i=1,v1,v2,w;i<=m;i++)
? ? ? ? {
? ? ? ? ? ? scanf("%d%d%d",&v1,&v2,&w);
? ? ? ? ? ? if(arr[v1][v2]>w||arr[v2][v1]>w)//選取權值最小的邊;
? ? ? ? ? ? ? ? arr[v1][v2]=arr[v2][v1]=w;
? ? ? ? }
? ? ? ? printf("%d\n",prim(n));
? ? }
}
總結
以上是生活随笔為你收集整理的图结构练习——最小生成树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bLue的除法算术题 数学
- 下一篇: C语言main()主函数执行完毕后是否会