洛谷Oj-最短网络 Agri-Net-最小生成树(模板题)

来源:互联网 发布:发帖软件 编辑:程序博客网 时间:2024/05/21 00:55

问题描述:
约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场。为了用最小的消费,他想铺设最短的光纤去连接所有的农场。
你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案。每两个农场间的距离不会超过100000
AC代码:

int boss[110];struct edge//最小生成树要这样建立结构体{    int x;    int y;    int w;};edge e[10010];bool cmp(const edge &a,const edge &b){    return a.w < b.w;}int get_boss(int x){    if(boss[x] == x)        return x;    else        return boss[x] = get_boss(boss[x]);}void merge(int x,int y){    int bx = get_boss(x);    int by = get_boss(y);    if(bx != by)        boss[by] = bx;    return;}bool query(int x,int y){    int bx = get_boss(x);    int by = get_boss(y);    return bx == by;}int main(){    int n,s = 1;    cin >> n;    for(int i = 1; i <= n; ++i)        for(int j = 1; j <= n; ++j)        {            int w;            scanf("%d",&w);            if(w == 0)                continue;            e[s].x = i;            e[s].y = j;            e[s].w = w;            s++;        }    for(int i = 1; i <= n; ++i)        boss[i] = i;    sort(e + 1,e + s,cmp);    int sum = 0,cnt = 0;    for(int i = 1; i <= s - 1; ++i)    {        if(query(e[i].x,e[i].y) == false)        {            merge(e[i].x,e[i].y);            cnt++;            sum += e[i].w;        }        if(cnt == n - 1)            break;    }    printf("%d\n",sum);    return 0;}

解决方法:
这次的最小生成树模板比之前的美观了许多,所以发上来作为今后的模板

原创粉丝点击