【prim + kruscal 】 最小生成树模板
来源:dlut oj
1105: Zhuo’s Dream
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 40 Solved: 14
[Submit][Status][Web Board]
Description
Zhuo is a lovely boy and always make day dream. This afternoon he has a dream that he becomes the king of a kingdom called TwoBee.
In the dream Zhuo faced a hard situation: he should make a traffic construction plan for the kingdom. We have known that the kingdom consists of N cities and M dirt roads, it’s very uncomfortable when travelling in the road. Now he would choose some roads to rebuild to concrete road. To avoid called TwoBee by the common people, Zhuo wants to show some excellent thing to this world while it needs your help. He wants his plan achieve two goals:
1. We should choose just N-1 roads to rebuild. After rebuild we can also travel between any two cities by the concrete roads.
2. We want to minimize the longest length among the chosen roads.
So you should write a program to calculate the total length of the chosen roads.
Input
There are multiple test cases.
The first line contains two integers N and M. (1 <= N <= 100, 1 <= M <= 10000)
In the next M lines, each line contains three integers a, b, w, indicating that there is a dirt road between city a and city b with length w. (1 <= a, b <= N, 1 <= w <= 1000)
Output
For each test case, output an integer indicating the total length of the chosen roads. If there is no solution, please output -1.
Sample Input
3 3
1 2 1 1 3 1 2 3 3
Sample Output
2
HINT
Source
prim算法
#include <cstdio>
#include <iostream>
#include <memory.h>
using namespace std;
const int maxn=;
const int inf=<<;
int map[maxn][maxn];
int dis[maxn];
bool flag[maxn];
int a,b,c,n,m,ans; void init()
{
memset(map,-,sizeof(map));
for(int i=;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(map[a][b]==- || c< map[a][b])
{
map[a][b]=map[b][a]=c;
}
}
} void prim()
{
memset(flag,false,sizeof(flag));
for(int i=;i<=n;i++)dis[i]=inf;
dis[]=;
ans=;
for(int j=;j<=n;j++)
{
int now,value=inf;
for(int i=;i<=n;i++)
{
if(flag[i]==false && dis[i]<value)
{
value=dis[i];
now=i;
}
}
if(value==inf)
{
cout << "-1" <<endl;
return;
}
flag[now]=true;
ans+=dis[now];
for(int i=;i<=n;i++)
{
if(!flag[i] && map[now][i]!=- && dis[i]>map[now][i])
dis[i]=map[now][i];
}
}
cout << ans <<endl;
} int main()
{
//'freopen("in.txt","r",stdin);
while(cin >> n >> m)
{
init();
prim();
}
return ;
}
kruskal算法:#include <cstdio>
#include <iostream>
#include <memory.h>
#include <algorithm>
using namespace std;
const int maxn=;
int m,n;
int cnt,length;
int parent[maxn]; struct node
{
int from;
int to;
int val;
}s[maxn]; bool cmp(const node &l,const node &r)
{
return l.val<r.val;
} void init()
{
for(int i=;i<maxn;i++)
{
parent[i]=i;
}
} int find(int x)
{
while(x!=parent[x])
{
x=parent[x];
}
return x;
} void merge(int a,int b,int val)
{
int roota=find(a);
int rootb=find(b);
if(roota!=rootb)
{
cnt++;
parent[rootb]=roota;
length+=val;
}
} void kruskal()
{
sort(s,s+n,cmp);
for(int i=;i<n;i++)
{
merge(s[i].from,s[i].to,s[i].val);
if(cnt==m-)break;
}
if(cnt<m-)
{
length=-;
}
} int main()
{
// freopen("in.txt","r",stdin);
while(cin >> m >> n)
{
init();
cnt=,length=;
memset(s,,sizeof(s));
for(int i=;i<n;i++)
{
cin >> s[i].from >> s[i].to >> s[i].val;
}
kruskal();
cout << length <<endl;
}
return ;
}
【prim + kruscal 】 最小生成树模板的更多相关文章
- HDU 1301-Jungle Roads【Kruscal】模板题
题目链接>>> 题目大意: 给出n个城市,接下来n行每一行对应该城市所能连接的城市的个数,城市的编号以及花费,现在求能连通整个城市所需要的最小花费. 解题分析: 最小生成树模板题,下 ...
- poj 1258 最小生成树 模板
POJ 最小生成树模板 Kruskal算法 #include<iostream> #include<algorithm> #include<stdio.h> #in ...
- POJ-图论-最小生成树模板
POJ-图论-最小生成树模板 Kruskal算法 1.初始时所有结点属于孤立的集合. 2.按照边权递增顺序遍历所有的边,若遍历到的边两个顶点仍分属不同的集合(该边即为连通这两个集合的边中权值最小的那条 ...
- 【HDU 4463 Outlets】最小生成树(prim,kruscal都可)
以(x,y)坐标的形式给出n个点,修建若干条路使得所有点连通(其中有两个给出的特殊点必须相邻),求所有路的总长度的最小值. 因对所修的路的形状没有限制,所以可看成带权无向完全图,边权值为两点间距离.因 ...
- 最小生成树模板【kruskal & prim】
CDOJ 1966 Kruskal 解法 时间复杂度O(mlogm) m为边数,这里主要是边排序占时间,后面并查集还好 #include <cstdio> #include <cst ...
- POJ 1258:Agri-Net Prim最小生成树模板题
Agri-Net Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 45050 Accepted: 18479 Descri ...
- 最小生成树--prim+优先队列优化模板
prim+优先队列模板: #include<stdio.h> //大概要这些头文件 #include<string.h> #include<queue> #incl ...
- HDU 1879 继续畅通工程(Prim||Kruscal模板题)
原题链接 Prim(点归并) //异或运算:相同为假,不同为真 #include<cstdio> #include<algorithm> #define maxn 105 us ...
- HDOJ-1301(最小生成树模板+Prim算法)
Jungle Roads HDOJ-1301 这是最小生成树的水题,唯一要注意的就是那个n,其实输入只有n-1行. #include<iostream> #include<cstdi ...
随机推荐
- 2016WHD.china世界云计算日·北京站即将召开
WHD.china自进驻中国以来,已在上海.北京成功举办多届,2015年于北京举办的会议更是盛况空前,注册参会者逾800人次,汇聚了国内外众多知名云服务商.IDC商.电子商务企业.电信运营商.ISP等 ...
- LeetCode OJ 162. Find Peak Element
A peak element is an element that is greater than its neighbors. Given an input array where num[i] ≠ ...
- SharePoint 2013 字段属性之JSLink 转载来源(http://www.cnblogs.com/jianyus/p/3544482.html)
在SharePoint 2013中,SPField新增加了一个属性是JSLink,使用客户端脚本修改字段前台展示,我们可以用很多方法修改这个脚本的引用,然后来修改脚本,下面,我们举一个简单的例子. 具 ...
- 关于ios 程序加载百度地图lib,出现链接错误:找不到符号 (null): _OBJC_CLASS_$_BMKMapManager的解决办法
报告的错误信息 ld: warning: ignoring file /Users/5012/Documents/sphuang/IOS_project/baidu_map/ShareLocation ...
- CURL访问url显示响应时间
curl -o /dev/null -s -w %{time_connect}:%{time_starttransfer}:%{time_total} http://www.baidu.com 时间指 ...
- php类于对象
类与对象是面向对象程序设计的一个基本概念,类就是指某一类东西,而对象就是某一个类的具体实例 比如:黑帮是一个类,那陈浩南就是这个类的一个对象 再比如:人是一个类,那张三就是这个类的一个具体的对象 ph ...
- 1.Perl 多线程:Threads
详情可查看: perldoc threads 调用线程的方法: $thr = threads->create(FUNCTION, ARGS) #This will create a new th ...
- Linux下wps字体问题
1.安装symbol-fonts_1.2_all.deb,自行搜索 2.卸载xfonts-mathml字体 sudo apt-get remove xfonts-mathml
- windows下更新python报错permission denied
注意退出所有python进程,可能是在使用中导致权限不足以删除
- VBS基础篇 - 循环语句(3) - For...Next
VBS基础篇 - 循环语句(3) - For...Next 指定循环次数,使用计数器重复运行语句,语法结构如下: 1 2 3 4 5 For counter = start To end [Ste ...