交通プロジェクトスムース
問題の説明
「円滑な交通プロジェクトは、」州内の任意の2つの村の間にすることですターゲット州政府は(限り、間接的に道路を通って上方に、必ずしも直接道路に接続されていない)道路交通を実現することができます。調査と評価した後、統計情報には、いくつかの道路、高速道路のコストの可能な構成のリストを得ました。今、あなたは州をクリアするために必要な最低のコストを計算するプログラムを書きます。
入力
テスト入力には、いくつかのテストケースが含まれています。各道路テストストリップ評価所定数N、村の数の最初の行M(<100); N、後続の
正の整数であり、それぞれ、二つの村の一対所与村道路行それぞれとの対応関係のコストこれらの二つの村(正の整数)間の道路の数とコスト。簡単にするため、村は1からMに番号が付け Nは、すべての入力端0である場合、出力結果を対応しません。
出力
各テストケースのために、出力最低コストは行の地域をクリアする必要がありました。データは、スムーズなフロー統計、出力を確保するのに十分でない場合は、「?。」
サンプル入力
3 3
1 2 1
1 3 2
2 3 4
1 3
2 3 2
0 100
サンプル出力
3
?
問題解決のアイデア:
スパニングツリーの計算をkruskul最小。互いに素-設定された記録の接続。
ACコード:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5+10;
int par[N];
struct node{
int to,from;
int w;
}edges[N];
int cnt,n;
bool cmp(node a1,node a2)
{
return a1.w<a2.w;
}
int find_(int x)
{
return par[x] == x ? x : find_(par[x]);
}
void union_(int a,int b)
{
par[find_(a)] = par[find_(b)];
}
int same(int a,int b)
{
return find_(a) == find_(b);
}
int kruskal()
{
int res = 0;
sort(edges,edges+n,cmp);
for(int i = 0 ; i < n ; i ++)
{
if(!same(edges[i].to,edges[i].from))
{
union_(edges[i].to,edges[i].from);
res += edges[i].w;
}
}
return res;
}
signed main()
{
int m;
while(~scanf("%lld%lld",&n,&m) && n)
{
for(int i = 0 ; i < n ; i ++)
{
int a,b,c;
scanf("%lld%lld%lld",&a,&b,&c);
edges[i].to = a;
edges[i].from = b;
edges[i].w = c;
}
for(int i = 0 ; i <= m ; i ++)
par[i] = i;
int ans = kruskal();
int cnt = 0;
for(int i = 1 ; i <= m ; i ++)
{
if(par[i] == i)
cnt++;
}
if(cnt != 1)
cout<<"?"<<endl;
else
cout<<ans<<endl;
}
}