7_22_Q题 Jungle Roads
题意
给出一张图,要求能把所有顶点链接起来的最短路径
思路
裸的最小生成树,就是输入比较怪
代码
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxm = 1e6 + 10;
const int maxn = 1e5 + 10;
typedef long long ll;
struct Edges{
int u,v,w;
Edges(){};
Edges(int u,int v,int w):u(u),v(v),w(w){};
bool operator < (const Edges & b) const {
return w < b.w;
}
}edge[maxm];
int fa[maxn];
int Find(int x){
return fa[x] == x ? x :fa[x] = Find(fa[x]);
}
bool Union(int x ,int y){
x = Find(x);
y = Find(y);
if(x == y) return false;
fa[x] = y;
return true;
}
ll lent = 0;
void init(int n){
for(int i = 0 ; i <= n ; i ++)
fa[i] = i;
lent = 0;
}
char Po[5];
char Poi[5];
int main (){
int T;
while (~scanf("%d", &T),T){
init(T);
int cnt = 0;
T --;
while(T --){
int n,cost;
scanf("%s",Po);
scanf("%d", &n);
for(int i = 0 ; i < n ; i ++){
scanf("%s %d",Poi,&cost);
edge[cnt++] = Edges(Po[0]-'A',Poi[0]-'A',cost);
}
}
sort(edge,edge+cnt);
for(int i = 0 ; i < cnt ; i ++){
Edges & e = edge[i];
if(Union(e.u,e.v)) {
lent += e.w;
}
}
printf("%lld\n", lent);
}
}