【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 ...
随机推荐
- 读书笔记之C# delegate
c#代理的使用主要在:需要将一个方法当做参数传递到另一个方法时. 比如启动一个线程执行任务,而这个线程要执行的方法可以通过代理传递过来. 代理包括一个方法或者多个方法的地址和C++的函数指针很相似,但 ...
- javascript基础(三)运算
原文http://pij.robinqu.me/ 递增递减操作符(包括前置和后置).一元正负符号操作符 这些操作符适用于任何数据类型的值,针对不同类型的值,该操作符遵循以下规则(经过对比发现,其规则与 ...
- POJ 2311 Cutting Game(SG+记忆化)
题目链接 #include<iostream> #include<cstdio> #include<cstring> using namespace std; ][ ...
- Excel教程(8) - 财务函数
ACCRINT 用途:返回定期付息有价证券的应计利息. 语法:ACCRINT(issue,first_interest, settlement, rate,par,frequency, basis) ...
- BestCoder Round #86 A B C
这次BC终于不像上次一样惨烈 终于A了三题…… 终测ing…… 发一波题解…… A.Price List A题十分无脑 只要把所有数加起来存到sum里 询问的时候大于sum输出1 否则输出0就行了…… ...
- digitalocean教程:你应该知道的10件事
DigitalOcean VPS性价比高,全球拥有多处机房,无须备案,非常适合守规矩的中国用户使用.digitalocean优惠码.digitalocean速度.digitalocean评测是网友关心 ...
- PHP class which generates PDF files from UTF-8 encoded HTML
http://www.mpdf1.com/mpdf/index.php
- javascript焦点图之垂直滚动
html代码布局,需要用到定位,不细说了 <!DOCTYPE html> <html lang="en"> <head> <meta ch ...
- BFS详解
广度优先搜索详解 1. 也称宽度优先搜索,顾名思义,就是将一棵树一层一层往下搜.算法首先搜索和s距离为k的所有顶点,然后再去搜索和S距离为k+l的其他顶点.BFS是一种完备策略,即只 ...
- C# 循环语句
本次主要学习了for循环语句. for循环语句的基本格式是: for(初始条件;循环条件;状态改变) { 循环体; } break——中断循环,跳出循环. continue——停止本次循环,进入下次循 ...