zoukankan      html  css  js  c++  java
  • 继续畅通工程(kruskal prim)

    kruskal算法
     
    #include <cstdio >
    #include <algorithm>
    using namespace std;
    const int MaxSize=105;
    int vest[200];
    struct edge
    {
        int u,v,w,op;
    } E[10000];//代表的是边的数目不能定义为 E[MaxSize ]MaxSize是顶点数目//wa了无数次
     
    bool cmp(edge a,edge b)
    {
        return a.w<b.w;
    }
    int Find(int t)
    {
        if(vest[t]==0)return t;
        else  return  Find(vest[t]);
    }
    bool HeBing(int a,int b)
    {
        int x=Find(a);
        int y=Find(b);
        if(x!=y)
        {
            vest[x]=y;
            return true;
        }
        return false;
    }
    int main()
    {
        int m;
        while(  scanf("%d",&m)&&m)
        {
            int n=m*(m-1)/2;
            for(int i=0; i<=m; i++)
                vest[i]=0;
            for(int i=1; i<=n; i++)
            {
                scanf("%d%d%d%d",&E[i].u,&E[i].v,&E[i].w,&E[i].op);
                if(E[i].op)HeBing(E[i].u,E[i].v);//先将修过的路合并起来,后面就不在修了
            }
            sort(E ,E+n+1,cmp);
            int  sum=0;
            for(int i=1; i<=n; i++)
            {
                if(HeBing(E[i].u,E[i].v) )//如果在一个集合内,就不再修路了
                    if(E[i].op==0)sum+=E[i].w;
            }
            printf("%d ",sum);
        }
            return 0;
        }
     
    prim算法

    #include <cstdio>
    #define Max 0x3f3f3f3f
    int N, Map[105][105], sum;

    void prim()
    {
    int k, Min, dis[105], vis[105];
    for(int i = 1; i <= N; i++) {
    dis[i] = Map[1][i];
    vis[i] = 0;
    }
    vis[1] = 1;
    for(int i = 1; i < N; i++) {
    Min = Max;
    for(int j = 1; j <= N; j++)
    if(!vis[j] && dis[j] < Min) {
    k = j;
    Min = dis[j];
    }
    vis[k] = 1;
    sum += Min;
    for(int j = 1; j <= N; j++) {
    if(!vis[j] && dis[j] > Map[k][j])
    dis[j] = Map[k][j];
    }
    }

    }


    int main()
    {
    int Start, End, Cost, Dis;
    while(scanf("%d", &N) && N) {
    for(int i = 1; i <= N; i++)
    for(int j = 1; j <= N; j++)
    Map[i][j] = Map[j][i] = Max;
    for(int i = 1; i <= N * (N - 1) / 2; i ++) {
    scanf("%d %d %d %d", &Start, &End, &Cost, &Dis);
    if(!Dis) {Map[Start][End] = Map[End][Start] = Cost;}
    else {Map[Start][End] = Map[End][Start] = 0;}
    }
    sum = 0;
    prim();
    printf("%d ", sum);
    }

    return 0;
    }

    梦里不知身是客,一晌贪欢。
  • 相关阅读:
    使用PuTTY时的文件上传下载方法
    [emacs org-mode小技巧] org-indent-mode 让文档更容易阅读
    tldr 的安卓客户端
    如何配置ssh免密码登录
    降低屏幕亮度,减缓眼疲劳 (linux/windows/firefox/android)
    Android上面安装Linux的方法
    Spring中argNames的含义
    js 输出 select 的值
    js 优先级
    layer.confirm( 找不到 on函数
  • 原文地址:https://www.cnblogs.com/dccmmtop/p/5052937.html
Copyright © 2011-2022 走看看