图论问题(2) : hdu 1102
题目转自hdu 1102,题目传送门
题目大意:
输入一个n*n的邻接矩阵,其中i行j列代表从i到j的路径的长度
然后又m条路已经帮你修好了,求最短要修多长的路才能使所有村庄连接
不难看出,这道题就是标准的最小生成树模板,多水啊
解题思路
虽然很水,但本人还是调了近1h才把代码调好......
下面介绍一下解决最小生成树的两个方法:
Prim 和 Kruskal
一,Prim(不懂的点这里)
Prim的思想和dijkstra的想法很想(如果不知道dijkstra算法的请点这里)
那么Prim的复杂度在为优化之前是O(n2),还是很慢的(虽然这道题能过)
既然这样,那这道题该怎么用Prim解呢?
思考了近10min后我想到了一个绝妙的方法,但是这里地方太小写不下
既然已经有建好了的,那我们肯定要用他已经建好的
所以,我们在输入时做一个预处理
将所有已经建过的路的距离化为0,然后再跑一遍Prim就行了
预处理代码如下:
for(int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
g[x][y]=g[y][x]=;
}
p.s.:g为邻接矩阵
然后在花15min打一遍Prim算法就可以愉快地AC了
AC代码如下:
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#define inf 2147483647
using namespace std;
bool vis[];
int n,m,cnt,ans,u;
int dis[];
int g[][];
void init()
{
ans=cnt=;
memset(vis,false,sizeof(vis));
memset(dis,0x7f,sizeof(dis));
return ;
}
void pirm()
{
dis[]=;
while(true)
{
u=;
for(int i=;i<=n;i++)
if(!vis[i] && (dis[i]<dis[u])) u=i;
if(u==) return ;
vis[u]=true;
ans+=dis[u];
for(int i=;i<=n;i++) dis[i]=min(dis[i],g[u][i]);
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
init();
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
scanf("%d",&g[i][j]);
scanf("%d",&m);
for(int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
g[x][y]=g[y][x]=;
}
pirm();
printf("%d\n",ans);
}
return ;
}
接下来看Kruskal......
二,Kruskal(不懂的点这里)
Kruskal中将用到hdu 1198中的并查集(点此转到我的的博客:图论问题(1):hdu 1198)
Kruskal主要就是把边按边权从小到大排序
在通过并查集检查目前最小的边的两端是否在同一集合中
若是,则跳过这条边
否则就把他们归为一个集合
这里只需要提前作这一步骤就行了
预处理代码如下:
for(int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
Union(x,y);
}
p.s.:其中Union为合并函数
然后就花个20min写完模板就可以愉快地AC了
AC代码如下:
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
struct edge
{
int from,to,w;
bool operator<(const edge &a)const
{
return w<a.w;
}
}e[];
int n,m,cnt,ans;
int fa[];
void init()
{
for(int i=;i<=n;i++) fa[i]=i;
cnt=ans=;
return ;
}
int find_fa(int x)
{
if(x==fa[x]) return x;
else
{
fa[x]=find_fa(fa[x]);
return fa[x];
}
return ;
}
void Union(int x,int y)
{
x=find_fa(x);
y=find_fa(y);
if(x<y) fa[y]=x;
else fa[x]=y;
return ;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
init();
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
scanf("%d",&e[cnt].w);
e[cnt].from=i;e[cnt].to=j;
cnt++;
}
scanf("%d",&m);
for(int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
Union(x,y);
}
sort(e,e+cnt);
for(int i=;i<cnt;i++)
if(find_fa(e[i].from)!=find_fa(e[i].to))
{
Union(e[i].from,e[i].to);
ans+=e[i].w;
}
printf("%d\n",ans);
}
return ;
}
今天的讲解就到这了,若果有没有听懂的可以借鉴一下《啊哈!算法》
图论问题(2) : hdu 1102的更多相关文章
- HDU 1102 最小生成树裸题,kruskal,prim
1.HDU 1102 Constructing Roads 最小生成树 2.总结: 题意:修路,裸题 (1)kruskal //kruskal #include<iostream> ...
- HDU 1102 Constructing Roads, Prim+优先队列
题目链接:HDU 1102 Constructing Roads Constructing Roads Problem Description There are N villages, which ...
- hdu 1102 Constructing Roads Kruscal
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1102 题意:这道题实际上和hdu 1242 Rescue 非常相似,改变了输入方式之后, 本题实际上更 ...
- hdu 1102 Constructing Roads(最小生成树 Prim)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1102 Problem Description There are N villages, which ...
- HDU 1102(Constructing Roads)(最小生成树之prim算法)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1102 Constructing Roads Time Limit: 2000/1000 MS (Ja ...
- hdu 1102 Constructing Roads (Prim算法)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1102 Constructing Roads Time Limit: 2000/1000 MS (Jav ...
- hdu 1102 Constructing Roads (最小生成树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1102 Constructing Roads Time Limit: 2000/1000 MS (Jav ...
- HDU 1102 Constructing Roads (最小生成树)
最小生成树模板(嗯……在kuangbin模板里面抄的……) 最小生成树(prim) /** Prim求MST * 耗费矩阵cost[][],标号从0开始,0~n-1 * 返回最小生成树的权值,返回-1 ...
- hdu 1102(最小生成树)
Constructing Roads Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
随机推荐
- 转载-Qualcomm MSM8953启动流程:PBL-SBL1-(bootloader)LK-Android
文章转载链接: https://blog.csdn.net/RadianceBlau/article/details/73229005 对于嵌入式工程师了解芯片启动过程是十分有必要的,在分析.调试各种 ...
- python正则图片爬取
# conding:utf8 import requests import re import time if __name__ == "__main__": # 所有的数据 ur ...
- sierpinski地毯(II)
今天又是因为可以用py而高兴的一天. 继续咱的sierpinski地毯计划. 二,随机算法 在二十年前,磁盘容量以MB还是KB计的时候,分形解决计图的问题确实有很大的优势.存至多十来个数就好了.我要在 ...
- Kubernetes Deployment(部署无状态应用)
Kubernetes Deployment(部署无状态应用) Pod与controllers的关系 • controllers:在集群上管理和运行容器的对象 • 通过label-selector相关联 ...
- 『CSP2019-S 第二轮退役记』
Day0 到杭州的时候是下午,休息了一下就吃完饭了. 晚上的时候闲着没事复习了一下几个不太熟的数论板子,\(\mathrm{exgcd}\),\(\mathrm{ExCRT}\),\(\mathrm{ ...
- PIE属性表多字段的文本绘制
最近研究了PIE SDK文本元素的绘制相关内容,因为在我们的开发中,希望可以做到在打开一个Shp文件后,读取到属性表的所有字段,然后可以选择一些需要的字段,将这些字段的所有要素值的文本,绘制到shp图 ...
- laravel npm run dev 错误 npm run dev error [npm ERR! code ELIFECYCLE]
出现此问题是node_modules出现错误,需要执行: 1 rm -rf node_modules 2 rm package-lock.json 3 npm cache clear --force ...
- 云顶之弈换中立python脚本
import pynput keyboard = pynput.keyboard.Controller() mouse = pynput.mouse.Controller() def on_relea ...
- 中国爬虫违法违规案例汇总github项目介绍
中国爬虫违法违规案例汇总github项目介绍 GitHub - 本项目用来整理所有中国大陆爬虫开发者涉诉与违规相关的新闻.资料与法律法规.致力于帮助在中国大陆工作的爬虫行业从业者了解我国相关法律,避免 ...
- CTF挑战赛丨网络内生安全试验场第一季答题赛火热开启
前期回顾:挑战世界级“人机大战”,更有万元奖金等你来拿 网络内生安全试验场自上线以来,受到了业内的极大重视与关注. 自9月2日报名通道开启后,报名量更是持续高升,上百名精英白帽踊跃报名. 至此,网络内 ...