最小生成树 TOJ 4117 Happy tree friends
链接http://acm.tju.edu.cn/toj/showp4117.html
4117. Happy tree friends
Time Limit: 1.0 Seconds Memory Limit: 65536K
Total Runs: 164 Accepted Runs: 60
yuebai has an undirected complete graph with n vertices. He wants to know the minimum spanning tree of the graph. It's so easy, so yuebai wants to challenge himself. He will choose one edge which must be
in the spanning tree.
INPUT
There are multiple test cases.
For each test case, the first line contain an integer n.
In the next n lines,
there is an adjacency matrix M. Mij denotes
the weight of the edge i to j.
Next line contains two dinstinct integer u and v,
which denotes the edge which is from u to v with
the value Muv must
be in the spanning tree.
(2≤n≤100,0≤Mij≤100). Mij=0 if
and only if i=j.
OUTPUT
For each case, print the result.
Sample Input
3
0 2 3
1 0 4
5 10 0
2 3
Sample Output
5
Hint
The edge of the spanning tree is 2->3 and 2->1
Source: TJU
Team Selection 2015 Round B
用Kruskal做
只要把题目中要求的边先合和起来,其余按照模版来,题目说了无向,所以对于每边的长度取矩阵中的最小值(真是坑,一开始以为是最小树形图)
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std; #define N 50005
int a[105][105];
struct graph{
int x,y,wei;
}nodd[N];
int m,n,ufind[N]; int cmp(graph a1,graph a2){
return a1.wei<a2.wei;
}
int find(int x){
return ufind[x]==x? x : ufind[x]=find(ufind[x]);
}
int Kruskal(int a,int b){
int ans=0;
int i,j;
for(i=1;i<=n;i++) ufind[i]=i;
sort(nodd,nodd+m,cmp);
ufind[a]=b;
for(i=0;i<m;i++){
int x=find(nodd[i].x); int y=find(nodd[i].y);
if(x!=y){
ans+=nodd[i].wei;
ufind[x]=y;
}
}
return ans;
} int main(){
int x;
int sum;
int temp;
int a1,a2;
int i,j,k;
while(scanf("%d",&x)!=EOF){
sum=0;
temp=0;
for(i=1;i<=x;i++)
for(j=1;j<=x;j++)
scanf("%d",&a[i][j]);
m=x*(x-1)/2;
n=x;
scanf("%d %d",&a1,&a2);
sum+=a[a1][a2];
a[a2][a1]=a[a1][a2];
for(i=1;i<=x;i++)
for(j=i+1;j<=x;j++){
nodd[temp].x=i; nodd[temp].y=j; nodd[temp].wei=min(a[i][j],a[j][i]);
temp++;
}
//for(i=0;i<temp;i++) printf("%d %d %d\n",nodd[i].x,nodd[i].y,nodd[i].wei);
printf("%d\n",Kruskal(a1,a2)+sum);
}
}
最小生成树 TOJ 4117 Happy tree friends的更多相关文章
- 说说最小生成树(Minimum Spanning Tree)
minimum spanning tree(MST) 最小生成树是连通无向带权图的一个子图,要求 能够连接图中的所有顶点.无环.路径的权重和为所有路径中最小的. graph-cut 对图的一个切割或者 ...
- [bzoj1016][JSOI2008]最小生成树计数 (Kruskal + Matrix Tree 定理)
Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的 ...
- 二分+最小生成树【bzoj2654】: tree
2654: tree 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. 二分答案,然后跑最小生成树判断. 注意优先跑白色边. code: ...
- prim算法查找最小生成树
我们在图的定义中说过,带有权值的图就是网结构.一个连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边.所谓的最小成本,就是n个顶点,用n-1条边把一个连通图连接 ...
- "《算法导论》之‘图’":最小生成树(无向图)
本文主要参考自<算法>. 加权图是一种为每条边关联一个权值或是成本的图模型.这种图能够自然地表示许多应用.在一幅航空图中,边表示航线,权值则可以表示距离或是费用.在一幅电路图中,边表示导线 ...
- 最小生成树之Kruskal(克鲁斯卡尔)算法
学习最小生成树算法之前我们先来了解下下面这些概念: 树(Tree):如果一个无向连通图中不存在回路,则这种图称为树. 生成树 (Spanning Tree):无向连通图G的一个子图如果是一颗包含G的所 ...
- 最小生成树 Prim算法 和 Kruskal算法,c++描述
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- 最小生成树之克鲁斯卡尔(Kruskal)算法
学习最小生成树算法之前我们先来了解下 下面这些概念: 树(Tree):如果一个无向连通图中不存在回路,则这种图称为树. 生成树 (Spanning Tree):无向连通图G的一个子图如果是一颗包含G的 ...
- 由最小生成树(MST)到并查集(UF)
背景 最小生成树(Minimum Spanning Tree)的算法中,克鲁斯卡尔算法(Kruskal's algorithm)是一种常用算法. 在克鲁斯卡尔算法中的一个关键问题是如何判断图中的两个点 ...
随机推荐
- 洛谷 [P2762] 太空飞行计划问题
最大权闭合子图 胡伯涛论文真是个好东西.jpg 求一个有向图的最大权闭合子图,常应用于有先决条件的最优化问题中 将所有正权点与源点相连,容量为点权; 将所有负权点与汇点相连,容量为点权的相反数; 将原 ...
- Markdown 安装图解(破解汉化教程)
http://blog.csdn.net/taokai_110/article/details/72934818 终于解决了问题
- open-falcon-agent插件使用
说明 Plugin可以看做是对agent功能的扩充.使用插件可以对采集脚本进行统一管理,方便定制修改,也可以免去在crontab中添加计划任务. 开启plugin功能 # 修改agent配置文件 &q ...
- 听说你开发.NET还在用VS,小哥哥给你推荐全平台的Rider
本文地址:http://www.cnblogs.com/likeli/p/8461010.html 前言 .NET平台的开发一直都只能使用Visual Studio来开发,自从dotnet core ...
- java程序设计原则
前言: 前言:java这种面向对象的的语言其实是很符合人的生活思维模式的,因为它以对象作为自己的研究对象,所谓"万物皆对象".一个人.一颗苹果.一只蚂蚁都是对象.所以它的设计原则和 ...
- MySQL复制同一个服务器的表结构和表数据
例如,现在服务器上有数据库 dbx 和 dby,dbx中有很多表,要把dbx中的表全部复制到dby,如下操作: 首先: use dby; [复制表结构] CREATE TABLE user LIKE ...
- 图论算法-网络最大流【EK;Dinic】
图论算法-网络最大流模板[EK;Dinic] EK模板 每次找出增广后残量网络中的最小残量增加流量 const int inf=1e9; int n,m,s,t; struct node{int v, ...
- Python中高阶函数sorted()用法
在Python中,有内置的排序方法:sorted(iterable, key, reverse). Sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序.key指定的函数 ...
- Spring实战思维导图
简要包含Spring的Bean.AOP.事务.容器等方面:
- 【Unity3D技术文档翻译】第1.4篇 AssetBundle 依赖关系
上一章:[Unity3D技术文档翻译]第1.3篇 创建 AssetBundles 本章原文所在章节:[Unity Manual]→[Working in Unity]→[Advanced Develo ...