zoukankan      html  css  js  c++  java
  • 求最小生成树(Prim算法)(1075)

    Description

         求出给定无向带权图的最小生成树。图的定点为字符型,权值为不超过100的整形。在提示中已经给出了部分代码,你只需要完善Prim算法即可。

    Input

         第一行为图的顶点个数n
         第二行为图的边的条数e
         接着e行为依附于一条边的两个顶点和边上的权值

    Output

         最小生成树中的边。

    Sample Input

    ABCDEF
    A B 6
    A C 1
    A D 5
    B C 5
    C D 5
    B E 3
    E C 6
    C F 4
    F D 2
    E F 6
     
    Sample Output
     
    (A,C)(C,F)(F,D)(C,B)(B,E)
     
     
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    using namespace std;
       
    typedef struct
    {
        int n;
        int e;
        char data[500];
        int edge[500][500];
    }Graph;
       
    typedef struct
    {
        int index;
        int cost;
    }mincost;
       
    typedef struct
    {
        int x;
        int y;
        int weight;
    }EDGE;
       
       
    typedef struct
    {
        int index;
        int flag;
    }F;
       
    void create(Graph &G, int n, int e)
    {
        int i, j, k, w;
        char a, b;
        for (i = 0; i< n; i++)
            cin >> G.data[i];
        for (i = 0; i< n; i++)
        for (j = 0; j< n; j++)
        {
            if (i == j)
                G.edge[i][j] = 0;
            else
                G.edge[i][j] = 100;
        }
       
        for (k = 0; k< e; k++)
        {
            cin >> a;
            cin >> b;
            cin >> w;
            for (i = 0; i< n; i++)
            if (G.data[i] == a) break;
            for (j = 0; j< n; j++)
            if (G.data[j] == b) break;
       
            G.edge[i][j] = w;
            G.edge[j][i] = w;
        }
        G.n = n;
        G.e = e;
    }
    #define inf 32767
    void Prim(Graph &G, int v)
    {
        int lowcost[100];
        int min, closest[100], i, j, k;
        for (i = 0; i < G.n; i++)
        {
            lowcost[i] = G.edge[v][i];
            closest[i] = v;
        }
        for (i = 1; i < G.n; i++)
        {
            min = inf;
            for (j = 0; j < G.n; j++)
            {
                if (lowcost[j] && lowcost[j] < min)
                {
                    min = lowcost[j];
                    k = j;
                }
            }
            cout << '(' << G.data[closest[k]] << ',' << G.data[k] << ')';
            lowcost[k] = 0;
            for (j = 0; j < G.n; j++)
                if (G.edge[k][j] && G.edge[k][j] < lowcost[j])
                {
                    lowcost[j] = G.edge[k][j];
                    closest[j] = k;
            }
        }
    }
       
       
       
    int main()
    {
        Graph my;
        int n, e;
        cin >> n >> e;
        create(my, n, e);
        Prim(my, 0);
        return 0;
    }
    View Code
     
  • 相关阅读:
    OC
    提取AppDelegate.m中的"RDVTabBarController"第三方框架的方法
    spring_aop
    spring_xml配置&依赖注入
    关于idea运行web项目时出现的浏览器问题
    Java中main方法参数类型个人粗略理解
    函数式编程_lambda
    反射_注解
    pl/sql使用小技巧
    触发器&索引&视图
  • 原文地址:https://www.cnblogs.com/traini13/p/4579877.html
Copyright © 2011-2022 走看看