类似求城市之间的边权和最小的题目。
最小生成树模板题,一览无余。
虽说是最小生成树,但是还有几个细节的地方需要注意。
第1点:
一个结构体排序,直接在结构体里用一个运算符重载来做的,代码很清晰,学长教的啦啦啦啦。
代码:
struct edge
{
int x, y, w;
edge(int x=0, int y=0, int w=0)/*:x(x),y(y),w(w)*/{}
bool operator < (const edge &b)const
{
return w < b.w;
}
}e[100];
//之后调用 sort(e + 1, e + M +1);
如果要从大到小排,直接把 w < b.w 改成 w > b.w 就行了
第2点:
输入输出的选择,开始的时候用scanf 程序一直 运不起来,所以改换了c++,在需要输入类似字符串,字符的时候,流式输入还是挺好用的。
第3点:
开始的时候想用map容器来关联A B C ...与1 2 3...的,但是想想毕竟只有一个字母,直接用字母-ASCII码(A是65,标记A为1,则 A为 ‘A’-64)。
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int N, M;
int fa[100];
struct edge
{
int x, y, w;
edge(int x=0, int y=0, int w=0)/*:x(x),y(y),w(w)*/{}
bool operator < (const edge &b)const
{
return w < b.w;
}
}e[100];
/*int cmp(const void *va, const void *vb)
{
edge *a, *b;
a = (edge*)va;
b = (edge*)vb;
if(a -> w > b -> w)
return 1;
if(a-> w < b-> w)
return -1;
return 0;
}*/
int find(int x)
{
if(x == fa[x]) return x;
else return fa[x] = find(fa[x]);
}
int kruscal()
{
int ans = 0;
sort(e + 1, e + M +1);
int cnt = N;
for(int i = 1; i <= N; i++)
fa[i] = i;
for(int i = 1; i<=M; i++)
{
int t1 = find(e[i].x);
int t2 = find(e[i].y);
if(t1 != t2)
{
fa[t1] = t2;
ans += e[i].w;
if(cnt == 1)
break;
}
}
return ans;
}
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif // LOCAL*/
while(scanf("%d", &N)!=EOF)
{
getchar();
if(N == 0)
break;
M = 1;
char tmpx, tmpy;
int k, tmpw;
for(int i = 0; i < N-1; i++)
{
cin>>tmpx>>k;
//scanf("%c%d", &tmpx, &k);
//getchar();
while(k--)
{
//getchar();
//scanf("%c%d", &tmpy, &tmpw);
//getchar();
cin>>tmpy>>tmpw;
e[M].x = tmpx - 64;
e[M].y = tmpy - 64;
e[M].w = tmpw;
M++;
}
}
int s = kruscal();
printf("%d\n", s);
}
return 0;
}