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

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;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 生活大爆炸版石头剪刀布 题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,...
    bbqub阅读 3,332评论 0 0
  • 数据结构实验之图论六:村村通公路 Time Limit: 1000MS Memory Limit: 655...
    Otis4631阅读 4,001评论 0 0
  • 明天的你,在为你等待。 明天会发生什么都是未知数,发生的事情,或许一步步按照自己规划的走,也或许逐渐变的连自己变得...
    王德彪阅读 910评论 0 0
  • 夜晚终将要降临 如果不能怀着一颗从容的心 也不要惊慌失措 静静的做你该做的事 一如平常 吃饭 睡觉 上班 积极的...
    洛可可哥特阅读 1,631评论 0 2
  • 曾经对学开车有很强的排斥的我,今天突然主动要提出要去学驾照了,家里人的反应不一,妹妹很惊讶的说,“怎么可能,你要去...
    息县心协沐风f阅读 1,878评论 0 1