「円滑な交通プロジェクトは、」州内の任意の2つの村の間にすることですターゲット州政府は(限り、間接的に道路を通って上方に、必ずしも直接道路に接続されていない)道路交通を実現することができます。調査と評価した後、統計情報には、いくつかの道路、高速道路のコストの可能な構成のリストを得ました。今、あなたは州をクリアするために必要な最低のコストを計算するプログラムを書きます。
入力
テスト入力には、いくつかのテストケースが含まれています。各道路テストストリップ評価所定数N、村の数の最初の行M(<100); N、後続の
正の整数であり、それぞれ、二つの村の一対所与村道路行それぞれとの対応関係のコストこれらの二つの村(正の整数)間の道路の数とコスト。簡単にするため、村は1からMに番号が付け Nは、すべての入力端0である場合、出力結果を対応しません。
出力
各テストケースについて、出力行の地域をクリアするのに必要な最低コスト。データは、スムーズなフロー統計、出力を確保するのに十分でない場合は、「?。」
入力サンプル
3 3
1 2 1
。1 3 2
2 4 3
。1. 3
2 3 2
0 100
出力例
。3
?
注:スムーズな流れを確保するかどうかを決定します
ブールフラグ= 1。
以下のために(INT I 2 =; I <= M; I ++)
IF(見つける(1)=検索(I)!){
フラグ= FALSE。
ブレーク;
}
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
#include<cstring>
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
//const int mod=1e9+7;
const int maxn=105;
int n,m;
int pre[maxn];
struct node{
int from,to,val;
}edge[maxn];
bool cmp(node x,node y){
return x.val<y.val;
}
int find(int x){
if(x==pre[x]) return x;
else
return pre[x] = find(pre[x]);
}
void join(int x,int y){
pre[find(x)] = find(y);
}
int main(){
while(scanf("%d %d",&n,&m) && n){
for(int i=0; i<=m; i++)
pre[i] = i;
for(int i=1; i<=n; i++)
scanf("%d %d %d",&edge[i].from,&edge[i].to,&edge[i].val);
sort(edge+1,edge+1+n,cmp);
int ans = 0;
for(int i=1; i<=n; i++){
if(find(edge[i].from)!=find(edge[i].to))
ans += edge[i].val;
join(edge[i].from,edge[i].to);
}
bool flag = 1;
for(int i=2; i<=m; i++)
if(find(1)!=find(i)){
flag = false;
break;
}
if(flag)
printf("%d\n",ans);
else
printf("?\n");
}
return 0;
}