説明
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);
}