基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
 收藏
 关注
N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树。

 
Input
第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量。(2 <= N <= 1000, 1 <= M <= 50000)
第2 - M + 1行:每行3个数S E W,分别表示M条边的2个顶点及权值。(1 <= S, E <= N,1 <= W <= 10000)
Output
输出最小生成树的所有边的权值之和。
Input示例
9 14
1 2 4
2 3 8
3 4 7
4 5 9
5 6 10
6 7 2
7 8 1
8 9 7
2 8 11
3 9 2
7 9 6
3 6 4
4 6 14
1 8 8
Output示例
37
prim算法:
#include<stdio.h>
#include<string.h>
#define inf 0x3f3f3f3f
int G[][];
int vis[],lowc[];
int prim(int G[][],int n){
int i,j,p,minc,res=;
memset(vis,,sizeof(vis));//全部初值为0表示没有访问过;
vis[]=;
for(i=;i<=n;i++)
lowc[i]=G[][i];
for(i=;i<=n;i++){
minc=inf;
p=-;
for(j=;j<=n;j++){
if(vis[j]==&&lowc[j]<minc)
{minc=lowc[j];p=j;}
}
if(inf==minc) return -;//原图不连通
res+=minc;
vis[p]=;
for(j=;j<=n;j++){//更新lowc[]
if(vis[j]==&&lowc[j]>G[p][j])
lowc[j]=G[p][j];
}
}
return res;
}
int main(){
int n,m;
int x,y,w;
while(~scanf("%d %d",&n,&m)){
memset(G,inf,sizeof(G));
while(m--){
scanf("%d%d%d",&x,&y,&w);
G[x][y]=G[y][x]=w;
}
printf("%d\n",prim(G,n));
}
}

kruskal算法:

#include <stdio.h>
#include <algorithm> using namespace std; #define _min_(a,b) ((a)<(b)?(a):(b))
#define INF 0x3f3f3f3f
#define MAX_N 1005
#define MAX_E 50005 struct edge
{
int u;
int v;
int cost;
}; edge es[MAX_E]; int N,M;
int W[MAX_N][MAX_N];
int mincost[MAX_N];
bool used[MAX_N]; bool cmp(edge e1, edge e2)
{
return e1.cost < e2.cost;
} // union-find set
int par[MAX_N];
int rank[MAX_N];
void init_inion_find(int n)
{
for(int i=;i<n;i++){
par[i]=i;
rank[i]=;
}
}
int find(int x)
{
if(par[x]==x){
return x;
}else{
return par[x]=find(par[x]);
}
}
void unite(int x,int y)
{
x=find(x);
y=find(y);
if(x==y){
return;
}
if(rank[x]<rank[y]){
par[x]=y;
}else{
par[y]=x;
if(rank[x]==rank[y]){
rank[x]++;
}
}
}
bool same(int x, int y)
{
return find(x)==find(y);
}
// end of union-find set void init()
{
for(int i=;i<MAX_N;i++){
for(int j=;j<MAX_N;j++){
W[i][j]=INF;
}
mincost[i]=INF;
used[i]=false;
}
} long long kruskal()
{
long long res=;
for(int i=;i<M;i++){
edge e=es[i];
if(!same(e.u, e.v)){
unite(e.u, e.v);
res += e.cost;
}
}
return res;
} int main()
{
//freopen("18_kruskal.txt","r",stdin);
init();
scanf("%d %d",&N,&M);
for(int i=;i<M;i++){
int u,v,cost;
scanf("%d %d %d",&u,&v,&cost);
es[i].u = u-;
es[i].v = v-;
es[i].cost = cost;
}
sort(es,es+M,cmp); init_inion_find(N); long long res = kruskal();
printf("%lld\n",res);
return ;
}

51nod1212无向图最小生成树的更多相关文章

  1. 51Nod-1212 无向图最小生成树

    51Nod: 1212 无向图最小生成树. link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1212 1212  ...

  2. 51nod1212 无向图最小生成树

    N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树. Input 第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量.(2 <= N <= 1000, 1 < ...

  3. 51 nod 1212 无向图最小生成树(Kruckal算法/Prime算法图解)

    1212 无向图最小生成树 N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树. 收起 输入 第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量.(2 <= N < ...

  4. 加权无向图 最小生成树 Prim算法 延迟版和即时版 村里修路该先修哪

    本次要解决的问题是:你们村里那些坑坑洼洼的路,到底哪些路才是主干道? 小明:肯定是哪里都能到得了,并且去哪里都相对比较近,并且被大家共用程度高的路是啊! 具体是哪几条路呢?今天就可以给出准确答案 最小 ...

  5. 无向图最小生成树(prim算法)

    普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之和亦为最小.该算法于1930年由捷 ...

  6. 51Nod 1212 无向图最小生成树 (路径压缩)

    N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树.   Input 第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量.(2 <= N <= 1000, 1 &l ...

  7. 51Nod 1212无向图最小生成树

    prim #include<stdio.h> #include<string.h> #define inf 0x3f3f3f3f ][]; ],lowc[]; ],int n) ...

  8. 51nod 1212 无向图最小生成树(Kruskal模版题)

    N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树.   Input 第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量.(2 <= N <= 1000, 1 &l ...

  9. (图论)51NOD 1212 无向图最小生成树

    N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树. 输入 第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量.(2 <= N <= 1000, 1 <= M ...

随机推荐

  1. 详解SQL Server连接(内连接、外连接、交叉连接)

    在查询多个表时,我们经常会用“连接查询”.连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志. 什么是连接查询呢? 概念:根据两个表或多个表的列之间的关系,从这些表中查询数据 ...

  2. Python拼接多张图片

    写机器学习相关博文,经常会碰到很多公式,而Latex正式编辑公式的利器.目前国内常用的博客系统,好像只有博客园支持,所以当初选择落户博客园.我现在基本都是用Latex写博文,然后要发表到博客园上与大家 ...

  3. HTTP,TCP/IP,Socket

    HTTP:超文本传输协议,首先它是一个协议,并且是基于TCP/IP协议基础之上的应用层协议. TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,HTTP是应用层协议,主要解决如何包装数据. ...

  4. Debian 7 安装 Emacs 24.4

    一. 安装依赖包 sudo apt-get build-dep emacs23 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 下列软件包将被[卸载]: li ...

  5. uva 699 The Falling Leaves dfs实现

    额,刘汝佳小白里面的配套题目. 题目求二叉树同垂直线上结点值的和. 可以用二叉树做,挺水的其实. 尝试使用dfs实现了:开一个大点的数组,根节点为最中间那点,然后读取时就可以进行和的计算了. 代码: ...

  6. South——谁说Django不能migrate!

    零.前言 最近改一个项目,需要对已有的model进行更改.大家都知道Django自带的syncdb只能创建数据库,但是无法将已经改变的model应用的数据库中. 大概两年前遇到这个问题的时候,网上的答 ...

  7. java.lang.IllegalArgumentException: Service Intent must be explicit: Intent

    在Activity中启动Service的时候报错: 服务意图必须是显性声明. 这是为了防止造成冲突(i.e. 有多个Service用同样的intent-filter的情况) 这是Android 5.0 ...

  8. ibatis中isEquals、isNotEmpty的用法

    一:isEquals用于动态拼接sql 如下实例: 如果status的状态为0,则更新attribute1;状态为1,则更新attribute2; 状态为2,则更新attribute3. <up ...

  9. Zabbix Api的使用

    API使用 zabbix官网文档:https://www.zabbix.com/documentation/2.2/manual/api, Zabbix API是基于JSON-RPC 2.0规格,具体 ...

  10. okhttputils开源库的混淆配置(Eclipse)

    #=====================okhttputils框架===================== #====okhttputils==== -libraryjars libs/okht ...