畅通工程

畅通工程

http://www.nowcoder.com/questionTerminal/23c9fe571c1346bb91fdffea8a0b195f

最小生成树,kruskal,并查集

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
typedef struct Node{
    int s; // 起点
    int d; // 终点
    int dis; // 距离
}Edge;
Edge E[100];
int father[101];
int N,M;
void init()
{
    for(int i = 0;i<=M;i++)
        father[i] = i;
}
int findfather(int n)
{
    if(father[n] == n)
        return n;
    else
        return findfather(father[n]);
}

int cmp(const void*a,const void*b)
{
    Edge *x = (Edge *)a;
    Edge *y = (Edge *)b;
    return x->dis - y->dis;
}
int kruskal()
{
    int ans = 0;
    qsort(E,N,sizeof(Edge),cmp);
    int j = 0;
    for(int i = 0;i<N;i++)
    {
        if(j == M-1)
            break;
        int x,y;
        //合并
        x = findfather(E[i].s);
        y = findfather(E[i].d);
        if(x!=y)
        {
            father[x] = y;
            ans += E[i].dis;
            j++;
        }
        else
            continue;
    }
    if(j == M-1)
        return ans;
    else
        return 0;
}

int main()
{
    while(scanf("%d",&N)!=EOF && N)
    {
        scanf("%d", &M);
        init(); // father初始化
        for (int i = 0; i < N; i++)
            scanf("%d%d%d", &E[i].s, &E[i].d, &E[i].dis);
        int ans = kruskal();
        if (ans)
            printf("%d\n", ans);
        else
            printf("?\n");
    }
    return 0;
}
全部评论

相关推荐

迷茫的大四🐶:💐孝子启动失败,改为启动咏鹅
点赞 评论 收藏
分享
珩珺:那些经历都太大太空了,实习的情况不了解,大创项目连名字、背景、目的及意义都没体现出来;地摊经济更是看完连卖的什么产品都不知道,项目成果直接写营收多少都更直观真实一点;后面那个校文体部的更是工作内容是组织活动整理流程,成果变成了当志愿者,而且你们学校本科学生会大一入学就直接当部长吗,志愿里面还提到了疫情防控,全面解封是22年12月的事情,可能时间上也有冲突。可能你花了钱人家就用AI给你随便写了点内容改了一下,没什么体现个性化的点
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务