村の道路(最小スパニングツリー)

標準の高速道路のコストの中にいくつかの道路の可能な構成をリスト、統計データテーブルの間の村の道路を既存の、それぞれの村は最も低コストの接続ニーズを求めて道路を持っています。

入力フォーマット:
入力データは町正の整数N(≤1000)の数と候補道路M(≤3N)の数と、M行はM後続のパスに対応し、各列3は正の整数を与え、各ストリップは、直接通信経路であります数2つの町や道路の再建の予算コスト。簡単にするため、町は1からNまでの番号

出力フォーマット:
出力最低のコストすべての村のニーズ。入力されたデータは、スムーズな流れを確保するのに十分でない場合は、-1の出力は、より多くの道路を構築する必要性を示しています。

サンプル入力:

6 15
1 2 5
1 3 3
1 4 7
1 5 4
1 6 2
2 3 4
2 4 6
2 5 2
2 6 6
3 4 6
3 5 1
3 6 1
4 5 10
4 6 8
5 6 3

出力例:

12

アイデア:最小スパニングツリー、ツリーアルゴリズムを最小全域が、一般的に2、プリムのアルゴリズムとクラスカルのアルゴリズムを持って解決するには、両方のアルゴリズムは、貪欲、貪欲な戦略が、同じではないという考えに基づいています。あなたがあなた自身の習慣見ることができます使用したい質問
、私はクラスカルのアルゴリズムを使用し、貪欲貪欲戦略の側面を、アイデアは、配列をソートするために昇順に右側にあり、双方が通信する場合ではありませんコンポーネントは、これは、そうでない場合は辺の数は、頂点の数は、その後に-1等しくどのくらいの最小スパニングツリーの数が-1、その後ループの外に、この時間を決定するトップエッジ点である場合、破棄、エッジの内側に最小スパニングツリーを追加しますその後、出力重み、それ以外の場合は出力-1、より多くの道路を構築する必要性を示します

コード:

#include<bits/stdc++.h>
using namespace std;
const int maxx=2010;
struct s{
	int v,w;
	int cost;
}t[maxx];
int father[maxx];
bool cmp(s& a1,s& a2){
	return a1.cost<a2.cost;
}
int findfather(int x){
	while(x!=father[x])
	 x=father[x];
	 return x;
}
int kruskal(int n,int m)//n个顶点,m条边数
{
	int cnt=0,summ=0;
	for(int i=0;i<m;i++){
		int a=findfather(t[i].v);
		int b=findfather(t[i].w);
		if(a!=b){
			father[a]=b;
			cnt++;
			summ+=t[i].cost;
		}
		if(cnt==n-1) break;
	}
	if(cnt==n-1) return summ;
	return -1;
 } 
int main()
{
  for(int i=0;i<maxx;i++)
    father[i]=i;
  int n,m;
  cin>>n>>m;
  for(int i=0;i<m;i++)
    cin>>t[i].v>>t[i].w>>t[i].cost;
  sort(t,t+m,cmp);
  cout<<kruskal(n,m);
  return 0;
}
公開された64元の記事 ウォン称賛21 ビュー774

おすすめ

転載: blog.csdn.net/qq_42090769/article/details/104074766