8-06. 畅通工程之局部最小花费问题(35)(最小生成树_Prim)(ZJU_PAT)

题目链接:http://pat.zju.edu.cn/contests/ds/8-06

某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出“畅通工程”的目标:使整个地区任何两个城镇间都可以实现快速交通(但不一定有直接的快速道路相连,只要互相间接通过快速路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建快速路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全地区畅通需要的最低成本。

输入格式说明:

输入的第1行给出村庄数目N (1<=N<=100);随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态:每行给出4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态 — 1表示已建,0表示未建。

输出格式说明:

输出全省畅通需要的最低成本。

样例输入与输出:

序号 输入 输出
1
3
1 2 1 0
1 3 2 0
2 3 4 0
3
2
3
1 2 1 0
1 3 2 0
2 3 4 1
1
3
3
1 2 1 0
1 3 2 1
2 3 4 1
0

PS:

用最小生成树的prim跑一下就好了!2333333……

代码如下:

#include <cstdio>
#include <cstring>
#include <iostream>
#define INF 0x3f3f3f3f
const int maxn = 117;
int m[maxn][maxn];
int vis[maxn], low[maxn];
int n;
int prim()
{
    vis[1] = 1;
    int sum = 0;
    int pos, minn;
    pos = 1;
    for(int i = 1; i <= n; i++)
    {
        low[i] = m[pos][i];
    }
    for(int i = 1; i < n; i++)
    {
        minn = INF;
        for(int j = 1; j <= n; j++)
        {
            if(!vis[j] && minn > low[j])
            {
                minn = low[j];
                pos = j;
            }
        }
        sum += minn;
        vis[pos] = 1;
        for(int j = 1; j <= n; j++)
        {
            if(!vis[j] && low[j] > m[pos][j])
            {
                low[j] = m[pos][j];
            }
        }
    }
    return sum;
}
int main()
{
    int a, b, c, d;
    while(~scanf("%d",&n))
    {
        int nn = n*(n-1)/2;
        memset(vis,0,sizeof(vis));
        memset(m,0,sizeof(m));
        for(int i = 1; i <= nn; i++)
        {
            scanf("%d%d%d%d",&a,&b,&c,&d);
            if(d == 0)//未修建的才建图
            {
                m[a][b] = c;
                m[b][a] = c;
            }

        }
        int ans = prim();
        printf("%d\n",ans);
    }
    return 0;
}
/*
3
1 2 1 0
1 3 2 0
2 3 4 0
3
1 2 1 0
1 3 2 0
2 3 4 1
3
1 2 1 0
1 3 2 1
2 3 4 1
*/
时间: 2024-10-19 18:46:26

8-06. 畅通工程之局部最小花费问题(35)(最小生成树_Prim)(ZJU_PAT)的相关文章

PTA 7-1 畅通工程之局部最小花费问题(35 分)

7-1 畅通工程之局部最小花费问题(35 分) 某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出"畅通工程"的目标:使整个地区任何两个城镇间都可以实现快速交通(但不一定有直接的快速道路相连,只要互相间接通过快速路可达即可).现得到城镇道路统计表,表中列出了任意两城镇间修建快速路的费用,以及该道路是否已经修通的状态.现请你编写程序,计算出全地区畅通需要的最低成本. 输入格式: 输入的第一行给出村庄数目N (1≤N≤100):随后的N(N?1)/2行对应村庄间道路的

7-1 畅通工程之局部最小花费问题 (35 分)

7-1 畅通工程之局部最小花费问题 (35 分) 某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出"畅通工程"的目标:使整个地区任何两个城镇间都可以实现快速交通(但不一定有直接的快速道路相连,只要互相间接通过快速路可达即可).现得到城镇道路统计表,表中列出了任意两城镇间修建快速路的费用,以及该道路是否已经修通的状态.现请你编写程序,计算出全地区畅通需要的最低成本. 输入格式: 输入的第一行给出村庄数目N (1≤N≤100):随后的N(N?1)/2行对应村庄间道路

HDU - 1233 还是畅通工程(带权并查集和最小生成树)

题意:用路把各个村庄连起来,不一定要有直接的公路相连,只要能间接通过公路可达即可,给出每两个村庄之间的距离,求畅通需要的最少长度. 1.最小生成树 Kruskal 解法 先按长度从小到大排序,因为要求最短,那肯定要先把短的连起来,如果有一条边还没有连起来,并且这条边上的两个点在两个连通分量中,那就连接起来. 可以用第二组数据模拟一遍(排序后): 4 1 2 1 1 4 1 2 4 2 2 3 3 1 3 4 3 4 5 1 #include <cstdio> 2 #include <al

HDU - 1879 继续畅通工程(最小生成树)

d.n个村庄,n*(n-1)/2条路,建立一些路使所有村庄可达.求建立路这些路的最小花费. s.最小生成树 c.Prim算法:cost[a][b]和cost[b][a]都得赋值. /* Prim算法 Prim求MST 耗费矩阵cost[][],标号从0开始,0~n-1 返回最小生成树的权值,返回-1表示原图不连通 */ #include<iostream> #include<stdio.h> #include<string.h> using namespace std;

(hdu step 6.1.4)还是畅通工程(求让n个点联通的最小费用)

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

&lt;hdu - 1863&gt; 畅通工程 并查集和最小生成树问题

本题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863  Problem Description: 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本.现请你编写程序,计算出全省畅通需要的最低成本.  Input: 测试输入包含若干测试用例.每个测试用例的第1行给出评估的道路条数 N.村庄数目M ( < 100

hdu1863 畅通工程2 还是用并查集思想解决最小生成树问题

http://acm.hdu.edu.cn/showproblem.php?pid=1863 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的选拔 畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 19994    Accepted Submission(s): 8528

(hdu step 6.1.5)继续畅通工程(求让n个点连通的最小费用)

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