美文网首页
数据结构实验之图论六:村村通公路(最小生成树之Prim算法)

数据结构实验之图论六:村村通公路(最小生成树之Prim算法)

作者: Otis4631 | 来源:发表于2017-11-18 13:36 被阅读0次

    数据结构实验之图论六:村村通公路

    Time Limit: 1000MS Memory Limit: 65536KB

    Problem Description

    当前农村公路建设正如火如荼的展开,某乡镇政府决定实现村村通公路,工程师现有各个村落之间的原始道路统计数据表,表中列出了各村之间可以建设公路的若干条道路的成本,你的任务是根据给出的数据表,求使得每个村都有公路连通所需要的最低成本。

    Input

    连续多组数据输入,每组数据包括村落数目N(N <= 1000)和可供选择的道路数目M(M <= 3000),随后M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个村庄的编号和修建该道路的预算成本,村庄从1~N编号。

    Output

    输出使每个村庄都有公路连通所需要的最低成本,如果输入数据不能使所有村庄畅通,则输出-1,表示有些村庄之间没有路连通。

    Example Input

    5 8
    1 2 12
    1 3 9
    1 4 11
    1 5 3
    2 3 6
    2 4 9
    3 4 4
    4 5 6
    

    Example Output

    19

    Hint

    /*
    Name:数据结构实验之图论六:村村通公路(最小生成树之Prim算法)
    Author:Mr.z
    Time:2016-11-25
    */
    #include <iostream>
    #include <memory.h>
    using namespace std;
    #define INF 0x3f3f3f3f
    #define MAX 1101
    
    bool visited[MAX];
    int arc[MAX][MAX];
    typedef struct Graph
    {
        int vex[MAX],vNum,eNum;
         
    };
    void CreatGraph(Graph &G)
    {
        memset(visited,0,sizeof(visited));
        memset(arc,INF,sizeof(arc));
        int u,v,w;
        for(int i=1;i<=G.vNum;i++)
            G.vex[i]=i;
        for(int i=1;i<=G.eNum;i++)
        {
            cin >> u >> v >> w;
            arc[u][v]=w;
            arc[v][u]=w;
        }
    }
    void Prim(Graph G,int begin)
    {
        int sum=0;
        visited[begin]=true;
        int k,min;
        int lowcost[MAX];
        for(int i=1;i<=G.vNum;i++)
            lowcost[i]=arc[i][1];
        for(int i=2;i<=G.vNum;i++)
        {
            min=INF;
            for(int j=1;j<=G.vNum;j++)
            if(lowcost[j] < min && !visited[j])
            {
                min=lowcost[j];
                k=j;
            }
            if(min==INF) {cout << -1 << endl;return;}
            sum+=min;
            visited[k]=true;
            for(int j=1;j<=G.vNum;j++)
            {
                if(lowcost[j]>arc[j][k] && !visited[j])
                {
                    lowcost[j]=arc[j][k];
                }
            }
        }
        cout << sum << endl;
    }
    int main()
    {
        Graph G;
        while(cin >> G.vNum >> G.eNum)
        {
            CreatGraph(G);
            Prim(G,1);
        }
    }
    

    相关文章

      网友评论

          本文标题:数据结构实验之图论六:村村通公路(最小生成树之Prim算法)

          本文链接:https://www.haomeiwen.com/subject/pvuevxtx.html