[最小生成数] 还是畅通工程

题目描述

某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。

输入

测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
        当N为0时,输入结束,该用例不被处理。

输出

对每个测试用例,在1行里输出最小的公路总长度。

样例输入

8
1 2 42
1 3 68
1 4 35
1 5 1
1 6 70
1 7 25
1 8 79
2 3 59
2 4 63
2 5 65
2 6 6
2 7 46
2 8 82
3 4 28
3 5 62
3 6 92
3 7 96
3 8 43
4 5 28
4 6 37
4 7 92
4 8 5
5 6 3
5 7 54
5 8 93
6 7 83
6 8 22
7 8 17
0

样例输出

82

分析:这是一道最小生成树的问题,下面分别用图的邻接矩阵和邻接表的方式存储图来进行求解。在使用邻接表时需要注意,这是一道多点测试题,每次输入图的数据时需要对邻接表进行清零操作。

一、邻接矩阵

#include <iostream>
using namespace std;

const int maxn=110;
const int INF=1e9;

int g[maxn][maxn];
int vis[maxn],d[maxn];
int n;

int prim(int s)
{
    fill(d,d+maxn,INF);
    fill(vis,vis+maxn,false);
    d[s]=0;
    int ans=0;
    for(int i=0;i<n;i++)
    {
        int u=-1,MIN=INF;
        for(int j=1;j<=n;j++)
        {
            if(vis[j]==false&&d[j]<MIN)
            {
                u=j;
                MIN=d[j];
            }
        }
        if(u==-1) return -1;
        vis[u]=true;
        ans+=d[u];
        for(int v=1;v<=n;v++)
        {
            if(vis[v]==false&&g[u][v]!=INF&&g[u][v]<d[v])
            {
                d[v]=g[u][v];
            }
        }
    }
    return ans;
}

int main()
{
    while(cin>>n)
    {
        fill(g[0],g[0]+maxn*maxn,INF);
        if(n==0) return 0;
        for(int i=0;i<n*(n-1)/2;i++)
        {
            int u,v;
            cin>>u>>v;
            cin>>g[u][v];
            g[v][u]=g[u][v];
        }
        int ans=prim(1);
        cout<<ans<<endl;
    }
}

二、邻接表

#include <iostream>
#include <vector>
using namespace std;

const int maxn=110;
const int INF=1e9;
struct Node
{
    int v,dis;
};
vector<Node> adj[maxn];
bool vis[maxn];
int d[maxn];
int n;

void init()
{
    for(int i=0;i<maxn;i++)
    {
        adj[i].clear();
    }
}

int prim(int s)
{
    fill(d,d+maxn,INF);
    fill(vis,vis+maxn,false);
    d[s]=0;
    int ans=0;

    for(int i=0;i<n;i++)
    {
        int u=-1,MIN=INF;
        for(int j=1;j<=n;j++)
        {
            if(vis[j]==false&&d[j]<MIN)
            {
                u=j;
                MIN=d[j];
            }
        }
        if(u==-1) return -1;
        vis[u]=true;
        ans+=d[u];
        for(int j=0;j<adj[u].size();j++)
        {
            int v=adj[u][j].v;
            if(vis[v]==false&&adj[u][j].dis<d[v])
            {
                d[v]=adj[u][j].dis;
            }
        }
    }
    return ans;
}

int main()
{
    while(cin>>n)
    {
        if(n==0) break;
        init();
        for(int i=0;i<n*(n-1)/2;i++)
        {
            int u,v,wt;
            cin>>u>>v>>wt;
            Node tmp;
            tmp.v=v;
            tmp.dis=wt;
            adj[u].push_back(tmp);
            tmp.v=u;
            adj[v].push_back(tmp);
        }
        int ans=prim(1);
        cout<<ans<<endl;
    }
}
时间: 2025-01-01 20:57:01

[最小生成数] 还是畅通工程的相关文章

ACM-最小生成树之畅通工程——hdu1863

畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 15572    Accepted Submission(s): 6462 Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出

ACM-最小生成树之畅通工程再续——hdu1875

***************************************转载请注明出处:http://blog.csdn.net/lttree*************************************** 畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 13547    Accepted Submis

ACM-最小生成树之继续畅通工程——hdu1879

***************************************转载请注明出处:http://blog.csdn.net/lttree*************************************** 继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 12918    Accepted Submis

HDU - 1232 畅通工程

畅通工程 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可).问最少还需要建设多少条道路? Input测试输入包含若干测试用例.每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M:随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号.为简单起见,城镇从1到N编号. 注意

HDU1863 畅通工程---(最小生成树)

畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 27972    Accepted Submission(s): 12279 Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出

HDU 1389 继续畅通工程【最小生成树,Prime算法+Kruskal算法】

继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 21871    Accepted Submission(s): 9356 Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列

HDU——1874畅通工程续(邻接矩阵弗洛伊德)

畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 41849    Accepted Submission(s): 15463 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走

hdu 1875 畅通工程再续(kruskal算法计算最小生成树)

畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 18411    Accepted Submission(s): 5769 Problem Description 相信大家都听说一个"百岛湖"的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先

杭电1233还是畅通工程

还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 25177    Accepted Submission(s): 11174 Problem Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路