最小生成树复习

5-13 畅通工程之最低成本建设问题   (30分)

某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出“畅通工程”的目标:使整个地区任何两个城镇间都可以实现快速交通(但不一定有直接的快速道路相连,只要互相间接通过快速路可达即可)。现得到城镇道路统计表,表中列出了有可能建设成快速路的若干条道路的成本,求畅通工程需要的最低成本。

输入格式:

输入的第一行给出城镇数目NN (1< N \le 10001<N≤1000)和候选道路数目M\le 3NM≤3N;随后的MM行,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号(从1编号到NN)以及该道路改建的预算成本。

输出格式:

输出畅通工程需要的最低成本。如果输入数据不足以保证畅通,则输出“Impossible”。

输入样例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

输出样例1:

12

输入样例2:

5 4
1 2 1
2 3 2
3 1 3
4 5 4

输出样例2:

Impossible
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
int n,s[1010][1010],dis[1010],vis[1011];
void tree()
{
    int k,sum=0;
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=n;i++)
    {
        dis[i]=INF;
    }
    for(int i=2;i<=n;i++)
    {
        dis[i]=s[1][i];
    }
    vis[1]=1;
    for(int i=0;i<n-1;i++)
    {
        int min1=INF,f=0;
        for(int j=1;j<=n;j++)
        {
            if(vis[j]==0&&dis[j]<min1)
            {
                f=1;
                min1=dis[j];
                k=j;
            }
        }
        if(f==0)
        {
            printf("Impossible\n");
            return ;
        }
        vis[k]=1;
        sum+=min1;
        for(int j=1;j<=n;j++)
        {
            if(vis[j]==0&&dis[j]>s[k][j])
            {
                dis[j]=s[k][j];
            }
        }
    }
    printf("%d\n",sum);
}
int main()
{
    int m,a,b,c;
    while(~scanf("%d%d",&n,&m))
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                s[i][j]=INF;
            }
        }
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            s[a][b]=c;
            s[b][a]=c;
        }
        tree();
    }
    return 0;
}
时间: 2024-11-09 02:27:40

最小生成树复习的相关文章

[算法第一轮复习] kruskal求最小生成树算法

最小生成树算法即MST,有kruskal,prim两种算法,这里主要介绍kruskal 什么是最小生成树? 对于一个图,保证其中每个点都可以连通的最小的花费 1.算法核心 贪心+并查集 2.算法实现过程 克鲁斯卡尔算法 假设 WN=(V,{E}) 是一个含有 n 个顶点的连通网,则按照克鲁斯卡尔算法构造最小生成树的过程为:先构造一个只含 n 个顶点,而边集为空的子图,若将该子图中各个顶点看成是各棵树上的根结点,则它是一个含有 n 棵树的一个森林.之后,从网的边集 E 中选取一条权值最小的边,若该

hdu 1863 [【最小生成树】+hdu2544【floyed】+hdu1874【dijdtra】~~~模板复习~~~

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863 #include<stdio.h> #include<string.h> #define inf 0x3f3f3f3f #define N 120 int book[N],w[N][N],min,dis[N]; int main() {     int m,n,i,j,t1,t2,t3,s,e,u,flag,sum;     while(scanf("%d%d"

面试常规算法复习(最小生成树)

两种常规的算法. package com.company; import java.util.Comparator; import java.util.PriorityQueue; import java.util.Queue; import java.util.Scanner; class Edge { int a, b, w; Edge(int a, int b, int w){ this.a = a; this.b = b; this.w = w; } } public class Mai

计算机网络复习

计算机网络复习 计算机网络这门课是本学期<软件技术基础>课程内容之一,所占课时数仅为20课时,卷面分数也是30分左右.但这门课的知识太多太杂,又经常和生活息息相关,比如:为什么配路由器的时候都是192.168.0.1?为什么校内的内网在校外无法访问?为什么上网慢要设置一下DNS这个东西?这些内容让我想多了解一点有关的知识,然而时间不多,只能上课听点,下课反复想,顺道拿两本教材之外的书1作为辅助.毕竟,TCP/IP的4层协议,以及书中的5层协议,每一层讲述的过程中都要“瞻前顾后”,还要“融会贯通

软件开发技术基础复习要点

软件开发技术基础复习要点 1.生存周期: 指一个软件从提出开发要求开始,经过需求分析.设计.制造.调试.使用.维护,直到软件产品被淘汰为止的整个过程. 2.简述软件工程的基本原理: 用分阶段的生命周期计划严格管理: 坚持进行阶段评审: 实行严格的产品控制: 采纳现代程序设计技术: 结果应该能清楚地审查: 开发小组应小而精: 承认不断改进软件工程实践的必要性. 3.简述产生软件危机的原因和解决办法: 原因:开发软件所需的高成本与软件产品的低质量之间存在尖锐的矛盾,致使软件开发陷入循环之中,即研制软

复习啦。。

模板复习计划.图论:最短路:Dijkstra SPFA Floyed最小圈(*) 二维Dijkstra.SPFA倍增Floyed(*)最小生成树,各种生成树(里面有些还不会) 最小树形图二分图:各种概念,二分图最大权匹配(KM), HC算法(*)网络流:(把所有建模都看一遍,,,不管会不会的)费用流(最小/大费用最大流) ZKW费用流(*)最大流上下界网络流 动态规划:树型Dp(*).数位Dp决策单调性(*)插头DP斯坦纳树(*)记忆化搜索 字符串:后缀自动机.AC自动机.回文自动机,字符串 +

HDU1102 最小生成树prim算法

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1102 题意:给出任意两个城市之间建一条路的时间,给出哪些城市之间已经建好,问最少还要多少时间使所有的城市连通? 思路:已经建好的城市之间需要的时间设为0,就是求最小生成树的权值和了. 顺便复习一下prim算法. 知道思想就可以实现,才是合格的搬砖工,希望以后脱离模板. 附代码: /* prim 最小生成树算法 过程:prim算法将图分为两部分,假设原顶点集为V,将其分为S和V-S两部分,S为已经确定

【BZOJ1937】[Shoi2004]Mst 最小生成树 KM算法(线性规划)

[BZOJ1937][Shoi2004]Mst 最小生成树 Description Input 第一行为N.M,其中 表示顶点的数目, 表示边的数目.顶点的编号为1.2.3.…….N-1.N.接下来的M行,每行三个整数Ui,Vi,Wi,表示顶点Ui与Vi之间有一条边,其权值为Wi.所有的边在输入中会且仅会出现一次.再接着N-1行,每行两个整数Xi.Yi,表示顶点Xi与Yi之间的边是T的一条边. Output 输出最小权值 Sample Input 6 9 1 2 2 1 3 2 2 3 3 3

最小生成树的Kruskal算法实现

最近在复习数据结构,所以想起了之前做的一个最小生成树算法.用Kruskal算法实现的,结合堆排序可以复习回顾数据结构.现在写出来与大家分享. 最小生成树算法思想:书上说的是在一给定的无向图G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即),而 w(u, v) 代表此边的权重,若存在 T 为 E 的子集(即)且为无循环图,使得的 w(T) 最小,则此 T 为 G 的最小生成树.说白了其实就是在含有 n 个顶点的连通网中选择 n-1 条边,构成一棵极小连通子图,并使该连