poj 1251 Jungle Roads(最小生成树kruscal+!学长秘授究极无敌新版结构体排序)

来源:互联网 发布:centos 创建文件夹 编辑:程序博客网 时间:2024/05/19 20:23

类似求城市之间的边权和最小的题目。


最小生成树模板题,一览无余。


虽说是最小生成树,但是还有几个细节的地方需要注意。


第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;}


0 0
原创粉丝点击