畅通工程经典例题(并查集+最小生成树+dij)hdu

图的应用—构造最小生成树 [问题描述] 某省自从实行了畅通工程计划后,终于修建了很多路。不过路多了也不好, 每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案 5 要比另一些方案行走的距离要短很多。这让行人很困扰。现在,请你设计程序计 算出要使这些城镇互通的最小路程长度。 立即下载

畅通工程

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 64340    Accepted Submission(s): 34421


Problem Description
某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?
 

Input
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M;随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。为简单起见,城镇从1到N编号。
注意:两个城市之间可以有多条道路相通,也就是说
3 3
1 2
1 2
2 1
这种输入也是合法的
当N为0时,输入结束,该用例不被处理。
 

Output
对每个测试用例,在1行里输出最少还需要建设的道路数目。
 

Sample Input

 
4 2
1 3
4 3
3 3
1 2
1 3
2 3
5 2
1 2
3 5
999 0
0
Sample Output

  
1
0
2
998
 题解:并查集。统计多少个联通块,把联通块看成点,边的个数等于顶点的个数-1.
#include <iostream>
#include <cstdio>
using namespace std;

int f[1200];

int find(int x)
{
    return f[x]==x?x:f[x]=find(f[x]);
}

void merge (int x, int y)
{
    int a=find(x);
    int b=find(y);
    if(a!=b)
        f[a]=b;
}
int main ()
{
    int n,m,sum;
    while(cin>>n,n)
    {
        cin>>m;
        for (int i=1; i<=n; i++)
            f[i]=i;
        sum=0;
        for (int i=0; i<m; i++)
        {
            int x,y;
            scanf("%d %d",&x,&y);
            merge(x,y);
        }
        for(int i=1;i<=n;i++)
            if(find(i)==i)
            sum++;
        cout<<sum-1<<endl;

    }
    return 0;
}

还是畅通工程

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 55280    Accepted Submission(s): 25120


Problem Description
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
 

Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
 

Output
对每个测试用例,在1行里输出最小的公路总长度。
 

Sample Input

  
3
1 2 1
1 3 2
2 3 4
4
1 2 1
1 3 4
1 4 1
2 3 3
2 4 2
3 4 5
0
 
Sample Output

  
3
5
题解:最小生成树
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
struct node
{
    int x,y,v;
} w[5050];
int f[101];
int find(int x)
{
    return f[x]==x?x:f[x]=find(f[x]);
}

int merge(int x,int y)
{
    int a=find(x);
    int b=find(y);
    if(a!=b)
    {
        f[a]=find(b);
        return 1;
    }
    return 0;
}
bool cmp (node a,node b)
{
    return a.v<b.v;
}
int main ()
{
    int n,m;
    while(cin>>n)
    {
        if(n==0)
            break;
        m=n*(n-1)/2;
        for (int i=1; i<=n; i++)
            f[i] = i;
        for (int i=0; i<m; i++)
        {
            cin>>w[i].x>>w[i].y>>w[i].v;

        }
        sort(w,w+m,cmp);
        int sum=0,t=0;
        for (int i=0; i<m; i++)
        {
            if(merge(w[i].x,w[i].y))
            {
                sum+=w[i].v;
            }
        }
        cout<<sum<<endl;

    }
    return 0;
}

畅通工程

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 36042    Accepted Submission(s): 16014


Problem Description
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
 

Input
测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M ( < 100 );随后的 N
行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。
 

Output
对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。
 

Sample Input

  
3 31 2 11 3 22 3 41 32 3 20 100
 
Sample Output

  
3
?
题解:最小生成树

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
struct node
{
    int x,y,v;
} w[5050];
int f[101];
int find(int x)
{
    return f[x]==x?x:f[x]=find(f[x]);
}

int merge(int x,int y)
{
    int a=find(x);
    int b=find(y);
    if(a!=b)
    {
        f[a]=b;
        return 1;
    }
    return 0;
}
bool cmp (node a,node b)
{
    return a.v<b.v;
}
int main ()
{
    int n,m;
    while(cin>>n>>m&&n)
    {
        for (int i=1; i<=n; i++)
            f[i] = i;
        for (int i=0; i<n; i++)
        {
            int x,y;
            cin>>w[i].x>>w[i].y>>w[i].v;
        }
        sort(w,w+n,cmp);
        int sum=0,t=0;
        for (int i=0; i<n; i++)
        {
            if(merge(w[i].x,w[i].y))
            {
                t++;//统计边的个数
                sum+=w[i].v;
            }
        }
        if(t==m-1)//连通图的判断条件
        cout<<sum<<endl;
        else
        cout<<"?"<<endl;
    }
    return 0;
}

畅通工程续

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 66280    Accepted Submission(s): 25655


Problem Description
某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。

现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
 

Input
本题目包含多组数据,请处理到文件结束。
每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。
接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。
再接下一行有两个整数S,T(0<=S,T<N),分别代表起点和终点。
 

Output
对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1.

Sample Input
3 3
0 1 1
0 2 3
1 2 1
0 2
3 1
0 1 1
1 2
 


Sample Output
2
-1

题解:Dijkstra算法

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int inf=0x3f3f3f3f;
int rela[200][200],dis[200],vis[200],n,m,s,t;
void dij()
{
    dis[s]=0;
    while(true)
    {
        int k=-1,minn=inf;
        for (int i=0; i<n; i++)
            if(dis[i]<minn&&!vis[i])
                {
                    minn=dis[i];
                    k=i;
                }
        if(k==-1)
            break;
        vis[k]=1;
        for (int i=0; i<n; i++)
            if(!vis[i]&&rela[k][i]<inf&&dis[i]>dis[k]+rela[k][i])
                dis[i]=dis[k]+rela[k][i];
    }
}

int main ()
{
    while(cin>>n>>m)
    {
        fill(rela[0],rela[0]+200*200,inf);
        fill(dis,dis+200,inf);
        fill(vis,vis+200,0);
        for (int i=0; i<m; i++)
        {
            int a,b,c;
            cin>>a>>b>>c;
            if(c<rela[a][b])//卡点,a,b可以重复,我们选择最短的一条边
            rela[a][b]=rela[b][a]=c;
        }
        cin>>s>>t;
        dij();
        if(dis[t]==inf)
            cout<<"-1"<<endl;
        else
            cout<<dis[t]<<endl;
    }
    return 0;
}

畅通工程再续

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 34515    Accepted Submission(s): 11433


Problem Description
相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组RPRush对百岛湖的情况充分了解后,决定在符合条件的小岛间建上桥,所谓符合条件,就是2个小岛之间的距离不能小于10米,也不能大于1000米。当然,为了节省资金,只要求实现任意2个小岛之间有路通即可。其中桥的价格为 100元/米。
 

Input
输入包括多组数据。输入首先包括一个整数T(T <= 200),代表有T组数据。
每组数据首先是一个整数C(C <= 100),代表小岛的个数,接下来是C组坐标,代表每个小岛的坐标,这些坐标都是 0 <= x, y <= 1000的整数。
 

Output
每组输入数据输出一行,代表建桥的最小花费,结果保留一位小数。如果无法实现工程以达到全部畅通,输出”oh!”.

Sample Input
2
2
10 10
20 20
3
1 1
2 2
1000 1000
 


Sample Output
1414.2
oh!
题解:还是最小生成树,只不过要自己构造边。

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include <vector>
using namespace std;
int f[101];
struct node
{
    int x,y;
} ns[101];
struct edge
{
    int x,y;
    double v;
    edge(int a,int b,double c)
    {
        x=a;
        y=b;
        v=c;
    }
};
bool cmp (edge a,edge b)
{
    return a.v<b.v;
}
int find(int x)
{
    return f[x]==x?x:f[x]=find(f[x]);
}
int merge(int x,int y)
{
    int a=find(x);
    int b=find(y);
    if(a!=b)
    {
        f[a]=b;
        return 1;
    }
    return 0;

}
int main ()
{
    int t ;
    cin>>t;
    while(t--)
    {
        int n;
        vector<edge>eds;//边的集合
        cin>>n;
        for (int i=0; i<n; i++)
            {
                f[i]=i;
                scanf("%d%d",&ns[i].x,&ns[i].y);
            }
        for (int i=0; i<n; i++)
        {
            int x1=ns[i].x,y1=ns[i].y;
            for(int j=i+1; j<n; j++)
            {
                int x2=ns[j].x,y2=ns[j].y;
                eds.push_back(edge(i,j,sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))));//存边
            }
        }
        sort(eds.begin(),eds.end(),cmp);
        double sum=0;
        int cnt=0;
        for (int i=0;i<eds.size();i++)
        {
            if(eds[i].v<10)
                continue;
            if(eds[i].v>1000)
                break;
            if(merge(eds[i].x,eds[i].y))
                {
                    sum+=eds[i].v;
                    cnt++;
                }
        }
        if(cnt==n-1)
        printf("%.1lf\n",sum*100);
        else
        printf("oh!\n");
    }
    return 0;
}

继续畅通工程

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 28023    Accepted Submission(s): 11804


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

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

当N为0时输入结束。
 

Output
每个测试用例的输出占一行,输出全省畅通需要的最低成本。
Sample Input
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
0
 


Sample Output
3
1
0
题解:最小生成树。已有路的,各自连成连通块,后面就可以用最小生成数算法了。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
struct node
{
    int x,y,v;
} w[5050];
int f[101];
int find(int x)
{
    return f[x]==x?x:f[x]=find(f[x]);
}

int merge(int x,int y)
{
    int a=find(x);
    int b=find(y);
    if(a!=b)
    {
        f[a]=b;
        return 1;
    }
    return 0;
}
bool cmp (node a,node b)
{
    return a.v<b.v;
}
int main ()
{
    int n,m;
    while(cin>>n&&n)
    {
        m=n*(n-1)/2;
        for (int i=1; i<=n; i++)
            f[i] = i;
        int cnt=0;
        for (int i=0; i<m; i++)
        {
            int x,y,v,f;
            scanf("%d%d%d%d",&x,&y,&v,&f);//数据较大,最好不用cin
            if(f)
               merge(x,y);
            else
            {
                w[cnt].x=x;
                w[cnt].y=y;
                w[cnt++].v=v;
            }
        }
        sort(w,w+cnt,cmp);
        int sum=0,t=0;
        for (int i=0; i<cnt; i++)
        {
            if(merge(w[i].x,w[i].y))
                sum+=w[i].v;
        }
        cout<<sum<<endl;
    }
    return 0;
}


【实战指南】EC-Engineer中ESI配置与PDO Mapping全流程解析 本文详细解析了EC-Engineer中ESI配置与PDO Mapping的全流程操作,包括环境准备、ESI文件导入技巧、在线配置细节及故障处理。特别强调了WinPcap驱动的兼容性问题和PDO Mapping的最佳实践,帮助工程师高效完成EtherCAT总线配置,适用于工业自动化领域的伺服控制与运动协同场景。 阅读详情

相关推荐

不会ps,你也可以成为ps高手,最强傻瓜式人像一键磨皮美白瘦脸美妆PS插件

比如:美肤是用来去斑点的,如果效果不太理想,就加大百分比,反之就减小。瘦脸如果脸胖的就打开,正常的就关闭。所谓的一键调节,要不只能调节一种效果,要不就是个预设,然后让你自己再调。同时,该软件还加入了贴心的批量处理功能,能同时处理上千张照片,让您喝着茶也能将工作做完。、自动检测照片中的人脸,包括鼻子,嘴巴,耳朵,眼睛和眉毛。、依托强大的脸部识别功能,可以高效的对人物全身皮肤进行智能识别,处理,使肤质平滑、过渡均匀。,这是网上下载的模糊照片,经过简单处理,你可以发现,眼睛变的更亮,皮肤更白,眼袋消失。

心语家园 - www.xinyucn.cc 2901

【学习笔记】最小生成树系列的必做经典题

今天才知道,原来最小生成树可以玩出这么多的花样。人麻了

1192

System Verilog学习笔记(十九)——覆盖率

覆盖率是用来衡量验证精度和完备性的数据指标。也可以告诉我们在仿真时设计的哪些结构被触发,哪些没被触发。高质量的验证需要满足以下三个条件。

ljy77882333的博客 2144

最小生成树详解+经典例题

零、邻接表的构建与使用: https://www.cnblogs.com/icode-girl/p/5273209.html 这个大佬讲的很好; 附代码:(邻接表创建与遍历) #include<iostream> #include<cstdio> using namespace std; int u[31],v[31],w[31],fir[31],sec[31]; int ...

Bearing in mind forever! 6924

STM32F103+AX58100 EtherCAT从站SPI移植实战:CubeMX配置避坑指南

本文详细介绍了STM32F103与AX58100 EtherCAT从站控制器的SPI接口移植实战,重点解析CubeMX配置中的关键参数与常见陷阱。内容涵盖硬件连接规范、SPI模式设置、中断优先级规划及协议栈对接技巧,帮助开发者高效实现工业自动化领域的实时通信方案。特别强调CPOL/CPHA配置与AX58100的匹配要求,避免数据错位问题。

weixin_29230865的博客 331

Claude Code + 自定义模型体验

AI 编程工具的发展突飞猛进:Cursor 横空出世,推出了“Agent 模式”;新竞争者如 Windsurf 也纷纷加入战局。几乎所有产品都开始转向“代理式(agentic)”开发模式——不再依赖单次 LLM 响应进行补全,而是让大模型在一个循环中调用各种工具,来完成更复杂的任务:分析代码库上下文、读取网页与文档、编译程序、运行测试、修复失败构建或测试、不断迭代等。

西京刀客 5799

并查集

学习了这位博主关于并查集的介绍后 https://blog.youkuaiyun.com/niushuai666/article/details/6662911 做了道题感受了下 从前有一个叫做”H湖”的地方,”H湖”的居民生活在不同的小岛上,当他们想去其他的小岛时都要通过划小船或者小岛之间的桥来实现.现在政府想实现”H湖”的全畅通!(不一定有直接的桥相连,只要互相间接通过桥可达即可).”H湖”已经造出了一些...

weixin_40136732的博客 576

基于STM32的工业I/O模块硬件电路实现

深入解析基于STM32的工业I/O模块硬件电路实现,涵盖关键电路设计与信号处理,突出硬件电路稳定性和工业级可靠性,适合嵌入式开发者参考。

weixin_35835018的博客 456

图的最小生成树——例题

最优布线问题 题目描述 Description 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场。当然,他需要你的帮助。 约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场。为了使花费最少,他想铺设最短的光纤去连接所有的农场。 你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案。 每两个农场间的距离不...

黑色吊椅的博客 3486

微信小程序URL Link全解析:从生成原理到实战应用(附Java代码)

本文深入解析微信小程序URL Link的生成原理与实战应用。URL Link是微信官方提供的智能路由协议,通过中间页实现外部链接安全跳转至小程序指定页面。文章详细阐述了其权限模型、环境版本差异及跳转机制,并提供了包含令牌管理、异常处理和性能优化的健壮Java实现方案,助力开发者构建高可用的链接生成服务。

weixin_29327525的博客 1219

最新版Node.js下载安装及环境配置教程(非常详细)

选择对应你系统的Node.js版本。

DN金猿的博客 12万+

HDU 畅通工程系列

HDU 1863(最小生成树) http://acm.hdu.edu.cn/showproblem.php?pid=1863 练习使用kruskal算法 #include<stdio.h> #include<algorithm> using namespace std; struct all { int u,v,w; }e[2000]; int...

Tongqi 870

基于ESP32-C3的物联网硬件设计:从免费工具链到PCB打样全流程实战

在物联网和嵌入式开发领域,硬件设计是连接软件逻辑与物理世界的关键环节。其核心原理在于通过电路设计将微控制器、传感器、通信模块等电子元件有机整合,实现特定功能。掌握硬件设计能力的技术价值在于能够自主实现产品原型,优化成本与性能,并深入理解系统底层运作。常见的应用场景包括智能家居节点、环境监测设备、工业传感终端等。本文以热门的ESP32-C3 RISC-V物联网芯片和广泛使用的KiCad免费EDA工具为例,详细解析了从核心器件选型、射频电路布局、PCB设计规则到Gerber文件生产的完整流程,并分享了在嘉立创平

weixin_30918633的博客 333

杭电 HDU 1233 还是畅通工程 (dij)

还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 31479    Accepted Submission(s): 14142 Problem Description 某省调查乡村交通状况,得到的统计表中列出了

舒哥的blog 829

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

畅通工程再续hdu1875

#include&amp;lt;iostream&amp;gt; #include&amp;lt;string.h&amp;gt; #include&amp;lt;cstdio&amp;gt; #include&amp;lt;cmath&amp;gt; #include&amp;lt;iomanip&amp;gt; #include&amp;lt;algorithm&amp;gt; using nam

weixin_43331783的博客 159

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

hdu 1233 还是畅通工程

还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 21144Accepted Submission(s): 9419 Problem Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的...

weixin_33929309的博客 76

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ACM 图论入门题(附代码解释)

目录 HDU 1869 六度分离 HDU 1874 畅通工程续 (最短路) HDU 3339 In Action (最短路+01背包) HDU 1162 Eddy's picture(prime算法) HDU 1863 畅通工程 (最小生成树) HDU 1301 Jungle Roads (最小生成树) POJ 3522 Slim Span (最小生成树) HDU 1102 Co...

不二君 1856

图论算法进阶习题集-500题



逆水行舟 2248

hdu 1874 畅通工程续(最短路的dijkstra算法实现&&Floyd算法实现)

最短路的dijkstra算法,主要使用与无负权值边图中单源路径最小值计算,主要思想是,以源点为起点,贪心(选取离源点最近的未处理的点)扩充源点所在的点集,并以找到的点为起点继续操作,直到到达目标点。这期间通过dist[i]数组记录源点到第i个点的最短路,到函数结束后,源点到图中算

laoda扯一扯 1618

总结分析一下三种求解最短路问题的算法,dijkstra算法,spfa算法,floyd算法。

说是总结,其实自己也没有学多长时间只是把自己这段时间的一些经验总结下来,用来供后来的初学者涨点经验吧。对于学习算法,个人的理解就是首先要去理解算法的本质,然后想想算法的实现过程,如何用代码去描述这个算法,然后就是去记模板了(对于像我这种初学者来说,这一步其实蛮重要的)。另外说下做最短路问题的一些容易出错的地方。1、要小心重边,就是题目会给你一些边类似于2 4 5,2 4 3;这种边和权值的。2、要

粥同学的学习笔记 6567

最短路prim算法c语言,最短路-Prim算法 dijkstra算法

HDU-1233#include #define INF 1000000using namespace std;int Map[][];bool NewNode[];bool OldNode[];bool UsedNode[];int lowcast[];int main(int argc, const char * argv[]) {int n;cin.sync_with_stdio(false...

weixin_34185033的博客 705

最小生成树合集(讲解与例题)

概念: 无向图中,其某个子图中任意两个顶点都互相连通并且是一棵树,称之为生成树;若每个顶点有权值,则其权值和最小的生成树为最小生成树。 适用范围: 能用图表示,求其权值和最小(或次小等)。 算法: (1) prim算法 参考自白皮p105. 类比Dijkstra算法,从某个顶点出发,不断加边。 int vis[MAXN]; //标记数组,表该点是否已经在集合中 int cost[MAXN][M...

苍界的博客 9612

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

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

weixin_30642029的博客 137

畅通工程:并查集入门裸题

畅通工程 Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通 (但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路? Input 测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( &...

dizhoukong2188的博客 179

bzoj 1601 最小生成树经典题

题意:n块农田,全部灌水。有两种方式:(1)在第n块天上花费wi建造一个水库(2)从另一块田j花费Pij引水,求最小花费 MST好题 如果没有可以建造水库的条件,那么就是一个最小生成树,没毛病╮(╯_╰)╭ 然而加上这个条件以后,相当于可以自己向自己引水花费为wi 加一个超级源点,并向n个点连边为wi,然后对这n+1个点跑最小生成树即可 编程难度为0,但是想到超级源点的难度还是不小的,超

Eirlys的博客 1242

hdu 1879 畅通工程 Kruskal

本题使用使用最小生成树解决,用一个结构体储存左界,右界和距离(权值)。把所有路线的距离从小到大排序,从最短的路开始,需要并查集来确定是否形成一个环,如果不是环,则存入。 Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。 Input 多组输入。每个测试用例的第1行给出村庄数目N ( < 100

m0_46260869的博客 188
上一篇: bfs培训例题题解
下一篇: C - たくさんの数式 / Many Formulas
也道长
博客等级 码龄9年 11粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值