美文网首页
(补+改)~-5 公路村村通

(补+改)~-5 公路村村通

作者: laochonger | 来源:发表于2018-03-14 08:32 被阅读0次

7-5 公路村村通(30 分)
现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。

输入格式:
输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N);随后的M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本。为简单起见,城镇从1到N编号。

输出格式:
输出村村通需要的最低成本。如果输入数据不足以保证畅通,则输出−1,表示需要建设更多公路。

输入样例:
6 15
1 2 5
1 3 3
1 4 7
1 5 4
1 6 2
2 3 4
2 4 6
2 5 2
2 6 6
3 4 6
3 5 1
3 6 1
4 5 10
4 6 8
5 6 3
输出样例:
12

这题我那时来不及做了...以我的水平,只会用邻接矩阵+dfs做

#include<cstdio>
#include<string>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;

const int mxn = 1105;
int a[mxn][mxn],n, book[mxn],mini = 999999, ext = 0;

void dfs(int c, int cnt, int num){
    if(num >= mini) return;
    if(cnt == n-1){
        ext = 1;
        //printf("%d %d ", mini,num);
        mini = num;
        return;
    }
    //book[c] = 1; //不能在这里标记,应该在函数外标记
    cnt++;
    for(int i = 1; i <=n ; i++){
        if(!book[i] && a[c][i] >= 1){
            //num += a[c][i];  //这里的num不能更新
            book[i] = 1;
            dfs(i, cnt, num + a[c][i]);
            book[i] = 0;
        }
    }
}

int main(){
    int num1,num2,price,road;
    scanf("%d %d", &n,&road);
    memset(a, -1, sizeof(a));
    while(road--){
        scanf("%d %d %d", &num1, &num2, &price);
        a[num1][num2] = price;
        a[num2][num1] = price;
    }
    
    for(int i = 1; i <= n; i++){
        a[i][i] = 0;
    }
    
    for(int i = 1; i <= n; i++){
        memset(book,0,sizeof(book));
        book[i] = 1;
        dfs(i , 0, 0);
    }
    if(ext) printf("%d", mini);
    else    printf("-1");
    return 0;
}

学长代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <string>
#include <cstring>
#include <map>
#include <queue>
#include <stack>

using namespace std;
int n,m;
struct edge
{
    int x,y,cost;
};
typedef struct edge edge;
edge a[3005];
int cmp(edge aa,edge bb)
{
    return aa.cost<bb.cost;
}
int fa[1005];
int Find(int x)
{
    if(fa[x]==x) return x;
    else return fa[x]=Find(fa[x]);
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<m;i++)
    {
        scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].cost);
    }
    sort(a,a+m,cmp);
    for(int i=0;i<=n;i++)
    {
        fa[i]=i;
    }
    int ans=0;
    int cnt=0;
    for(int i=0;i<m;i++)
    {
        int x=a[i].x;
        int y=a[i].y;
        int cost=a[i].cost;
        int aa=Find(x);
        int bb=Find(y);
        if(aa!=bb)
        {
            fa[aa]=bb;
            ans+=cost;
            cnt++;
            if(cnt==n-1)
            {
                break;
            }
        }
    }
    if(cnt<n-1)
    {
        printf("-1\n");
    }
    else
    {
        printf("%d\n",ans);
    }


    return 0;
}

相关文章

  • (补+改)~-5 公路村村通

    7-5 公路村村通(30 分)现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个...

  • 甘肃平凉:村村通公路发生病害 起因及修补步骤

    1、村村通公路病害 村村通公路经常会出现多种类型的路面病害,有表层病害的起砂、起皮等,还有深层病害如露石子...

  • 未来3年还会有多少年轻人留在农村?专家说一数字,大家都不敢信

    我们就目前我国发展农村经济的势头就可以看到,农村建设方面由以前的村村通水电到村村通公路,一直到现在村村通水泥路,村...

  • 学习了解十四五规划

    2021年是建党100周年也是“十四五”规划的开局之年。 十四五规划要基本上实现五通: 村村通公路、 村村通水电、...

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

    数据结构实验之图论六:村村通公路 Time Limit: 1000MS Memory Limit: 655...

  • 拿什么抚慰你,孤单的孩子

    前段时间回家看望母亲,家乡变化很大,村村通公路让回家的路顺畅许多,不仅如此,晚上,公路旁还亮起了路灯,让原本漆黑一...

  • 老家修路了

    故乡修路的消息传来 这次是真的修到我村了 20年前的报纸 曾被贴在奶奶墙上 报道全县村村通公路 那公路到村有二三里...

  • 乡愁

    回到阔别已久的故乡,十年前村村通公路,可是现在的公路没有原来的平坦,原来虽然道路狭窄,但是因为是新修的,不像现在的...

  • 太爷爷与鹅的“天伦之乐”

    我家汤先生带着女儿回安徽有一项很重要的任务就是祭祖。回来后,他们俩都争着说家乡的变化。村村通公路,公路两边全是太阳...

  • 2017-08-04

    为尽早完成“村村通客车”攻坚行动任务,更好的满足婺城区人民群众安全,经济,便捷的出行需求,婺城区公路管理...

网友评论

      本文标题:(补+改)~-5 公路村村通

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