[最小生成树] 继续畅通工程

题目描述

省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。

输入

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

当N为0时输入结束。

输出

每个测试用例的输出占一行,输出全省畅通需要的最低成本。

样例输入

4
1 2 1 1
1 3 6 0
1 4 2 1
2 3 3 0
2 4 5 0
3 4 4 0
3
1 2 1 1
2 3 2 1
1 3 1 0
0

样例输出

3
0

分析:两个思路,一个是在更新d[]数组时增加判断这条路是否已经修建好。第二个思路是在输入数据时,如果这条路已经修建好,则将这条路的修建花费赋值为0。

#include <iostream>
using namespace std;

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

int g[maxn][maxn],flag[maxn][maxn];
bool vis[maxn];
int 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)
            {
                if(flag[u][v]==1)
                {
                    d[v]=0;
                }
                else if(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);
        fill(flag[0],flag[0]+maxn*maxn,0);
        if(n==0) break;
        for(int  i=0;i<n*(n-1)/2;i++)
        {
            int u,v,w,f;
            cin>>u>>v>>w>>f;
            //if(f==1) w=0;
            g[v][u]=g[u][v]=w;
            flag[u][v]=flag[v][u]=f;

        }
        int ans=prim(1);
        cout<<ans<<endl;
    }
}
时间: 2024-11-04 10:35:15

[最小生成树] 继续畅通工程的相关文章

算法之最小生成树(继续畅通工程)

个人比较爱好刷算法题,然后最近遇到一个算法题,是最小生成树的问题,是继续畅通工程,首先先看下具体要求: 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态.现请你编写程序,计算出全省畅通需要的最低成本. 输入描述:     测试输入包含若干测试用例.每个测试用例的第1行给出村庄数目N ( 1< N < 100 ):随

hdoj 1233 还是畅通工程

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

hdu 1863 畅通工程 kruskal || prim

简单最小生成树,畅通工程,这三道题目都是练习最小生成树的. 注意一下判断是否有通路时,kruskal可以判断每个点的祖先是否相同,prim可以判断每个点是否都加进集合里面了,也就是说是否都访问过.prim算法要把没有给的边初始化为MAX无穷大... 代码:(kruskal) #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath>

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 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 相信大家都听说一个"百岛湖"的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先

hdoj 1863 畅通工程 【最小生成树】+【kruskal】

题意:... 难点:如何判断是不是信息不全:在输入的时候建立并查集,之后判断有几个节点就可以了,剩下的就是kruskal算法. 代码: #include<stdio.h> #include<string.h> #include<algorithm> #define MAXN 105 #define INF 0x3f3f3f3f using std::sort; struct node{ int from; int to; int w; }edges[MAXN*MAXN]

HDU 1863 畅通工程 (最小生成树)

Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本.现请你编写程序,计算出全省畅通需要的最低成本. Input 测试输入包含若干测试用例.每个测试用例的第1行给出评估的道路条数 N.村庄数目M ( < 100 ):随后的 N 行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间

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

Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态.现请你编写程序,计算出全省畅通需要的最低成本. Input 测试输入包含若干测试用例.每个测试用例的第1行给出村庄数目N ( 1< N < 100 ):随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整

hdu 1879 继续畅通工程 最小生成树入门模板题

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