グラフ理論[] []最適な配線の最小木問題をまたがります

説明

N学校のコンピュータは、データ伝送を容易にするために、今、データラインとそれらを接続します。これは、2台のコンピュータが、それらの間のケーブル接続で接続されているを指します。コンピュータ、2台のコンピュータの異なる接続のため、コストが異なる場合が多いの異なる位置に起因しています。
二つのコンピュータのいずれかがデータ線に接続されている場合はもちろん、コストはかなり巨大になります。コストを節約するために、我々はコンピュータが他のコンピュータとの接続を実現するために、間接的に(転送など)複数のコンピュータによって、すなわち、データの伝送の間接的な手段をすることができます使用しました。
今、あなたはこれらのコンピュータを接続するための責任がある、あなたのタスクは、任意の2台のコンピュータが(直接または間接的かどうか)に通信しているようにすることです。

入力

入力ファイルwire.in、第一行動整数N(2 <= N <= 100)は、コンピュータの数を表します。n個の整数のn行の後。X + 1は、行yの最初の列は、直接コンピュータ接続料金とX-Yステージのコンピュータの整数を表します。

出力

出力ファイルwire.out、最小の接続料を表す整数。

サンプル入力

3
0 1 2
1 0 1
2 1 0

サンプル出力

2(注:1と2,2がその接続3と2のコストを示します)


問題解決のためのアイデア

明らかに最小ツリーテンプレートをまたがります

クラスカルのアルゴリズム
最小のエッジを見つけるたびに、そうでない場合は、エッジによって接続された2点のコレクションは、その後も、一緒に2点を入れて
ここに画像を挿入説明
常に最短エッジを探して、この辺は2点の集合ではなく、
ここに画像を挿入説明
最終的
ここに画像を挿入説明
な方法押しプリムのアルゴリズムを


#include<iostream>
#include<cstdio>
using namespace std;
const int INF=0x7fffffff;
int a[200][200],n,p[200],Gun;
void kruskal(){
	for(int g=1;g<n;g++){//因为必定只会连n-1条边
		int mi=INF,k,l;
		for(int i=1;i<=n;i++)
		    for(int j=1;j<=n;j++)
		        if(a[i][j]<mi&&a[i][j]&&p[i]!=p[j]){//两点不在一个集合p[i]!=p[j]
		        	mi=a[i][j];
		        	k=i,l=j;
		        }
	    Gun+=a[k][l]; //累计答案
	    int s=p[k];
		for(int i=1;i<=n;i++)
		    if(p[i]==s)//因为总有一个i==k,把p[k]赋成p[l],后面都赋值不了了
		       p[i]=p[l];
	}
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		p[i]=i;
		for(int j=1;j<=n;j++)
		    scanf("%d",&a[i][j]);
	}
	kruskal();
	printf("%d",Gun);
}
公開された45元の記事 ウォンの賞賛0 ビュー357

おすすめ

転載: blog.csdn.net/qq_39940018/article/details/103641177