最小生成树练习3(普里姆算法Prim)
风萧萧兮易水寒,壮士要去敲代码。本女子开学后再敲了。。
poj1258 Agri-Net(最小生成树)水题。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
const int N=;
int n,m;
int g[N][N],low[N];
void prim(int u0){
int i,j,mi,v,ans=;
for(i=;i<n;++i){
low[i]=g[u0][i];
}
low[u0]=-;
for(i=;i<n;++i){
mi=inf;
v=-;
for(j=;j<n;++j)
if(low[j]!=-&&low[j]<mi){
v=j; mi=low[j];
}
ans+=low[v];
low[v]=-;
for(j=;j<n;++j){
if(g[v][j]<low[j]){
low[j]=g[v][j];
}
}
}
printf("%d\n",ans);
}
int main(){
int t,i,j;
while(scanf("%d",&n)==){
memset(g,inf,sizeof(inf));
for(i=;i<n;++i)
for(j=;j<n;++j)
scanf("%d",&g[i][j]);
prim();
}
return ;
}
poj1751 Highways(最小生成树)水题。已修好的路赋值为0。不用sqrt计算距离,因为题目没要求。做完这题后把自学时的模板改了一点,因为一开始的模板太挫。。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int inf=0x3f3f3f3f;
const int N=;
int n,m;
int g[N][N],low[N],near[N],x[N],y[N];
void prim(int u0){
int i,j,mi,v;
for(i=;i<=n;++i){
low[i]=g[u0][i];
near[i]=u0;
}
low[u0]=-;
for(i=;i<n;++i){
mi=inf;
v=-;
for(j=;j<=n;++j)
if(low[j]!=-&&low[j]<mi){
v=j; mi=low[j];
}
if(mi!=)printf("%d %d\n",near[v],v);
low[v]=-;
for(j=;j<=n;++j){
if(g[v][j]<low[j]){
low[j]=g[v][j];
near[j]=v;
}
}
}
}
int main(){
int t,i,j;
scanf("%d",&n);
memset(g,inf,sizeof(g));
for(i=;i<=n;++i) scanf("%d%d",&x[i],&y[i]);
for(i=;i<=n;++i){
for(j=i+;j<=n;++j){
g[i][j]=g[j][i]=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
}
}
scanf("%d",&m);
while(m--){
scanf("%d%d",&i,&j);
g[i][j]=g[j][i]=;
}
prim();
return ;
}
poj1789 Truck History(最小生成树)每种卡车类型都是由其他卡车类型派生出来,第一种除外。理解:顶点为卡车类型,边的权值为类型对(t0,d0)的距离(编码中不同字符的位置数目)。。看懂题看得头疼,其实不难做。
#include<cstdio>
#include<cstring>
using namespace std;
const int inf=0x3f3f3f3f;
const int N=;
int n;
char code[N][];
int g[N][N],low[N],a[N],ans;
void prim(int u0){
int i,j,mi,v;
ans=;
for(i=;i<n;++i){
low[i]=g[u0][i];
}
low[u0]=-;
for(i=;i<n;++i){
mi=inf;
v=-;
for(j=;j<n;++j)
if(low[j]!=-&&low[j]<mi){
v=j; mi=low[j];
}
ans+=low[v];
low[v]=-;
for(j=;j<n;++j){
if(g[v][j]<low[j])
low[j]=g[v][j];
}
}
printf("The highest possible quality is 1/%d.\n",ans);
}
int main(){
int i,j,k,d;
while(scanf("%d",&n),n){
memset(g,inf,sizeof(g));
for(i=;i<n;++i) scanf("%s",code[i]);
for(i=;i<n-;++i){
for(j=i+;j<n;++j){
d=;
for(k=;k<;++k)
d+=(code[i][k]!=code[j][k]);
g[i][j]=g[j][i]=d;
}
}
prim();
}
return ;
}
poj2349 Arctic Network(最小生成树)求出最小生成树,将边从大到小排序,前s-1条用s个卫星通信,第s大边即为答案。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int inf=0x3f3f3f3f;
const int N=;
int n,s;
double g[N][N],low[N],d[N],x[N],y[N];
int cmp(int a,int b){
return a > b;
}
void prim(int u0){
int i,j,mi,v;
int cnt=;
for(i=;i<n;++i){
low[i]=g[u0][i];
}
low[u0]=-;
for(i=;i<n;++i){
mi=inf;
v=-;
for(j=;j<n;++j)
if(low[j]!=-&&low[j]<mi){
v=j; mi=low[j];
}
d[cnt++]=low[v];
low[v]=-;
for(j=;j<n;++j){
if(g[v][j]<low[j])
low[j]=g[v][j];
}
}
sort(d,d+cnt,cmp);
printf("%.2f\n",d[s-]);
}
int main(){
int t,i,j;
double d;
scanf("%d",&t);
while(t--){
memset(g,inf,sizeof(g));
scanf("%d%d",&s,&n);
for(i=;i<n;++i) scanf("%lf%lf",&x[i],&y[i]);
for(i=;i<n;++i){
for(j=i+;j<n;++j){
d=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
g[i][j]=g[j][i]=d;
}
}
prim();
}
return ;
}
poj3026 Borg Maze(最小生成树,bfs预处理)因为这题我几天没打码了,今天做出来感觉也不是很难。还是深感基础之弱内心痛苦。。对了,记得看discuss哦,如果你不想多挥霍青春的话。。。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int inf=0x3f3f3f3f;
const int N=;
const int M=;
int x,y;
int n;
int dir[][]={,,,-,,,-,};
int g[M][M],low[M];
char mp[N][N];
int G[N][N];
int vd[N][N];
void bfs(int sx,int sy){
queue<pair<int,int> >q;
while(!q.empty())q.pop();
memset(vd,-,sizeof(vd));
vd[sx][sy]=;
q.push(make_pair(sx,sy));
while(!q.empty()){
pair<int,int>u=q.front(); q.pop();
if(G[u.first][u.second]>)
g[G[sx][sy]][G[u.first][u.second]]=vd[u.first][u.second];
for(int i=;i<;++i){
int xx=u.first+dir[i][];
int yy=u.second+dir[i][];
if(mp[xx][yy]=='#'||vd[xx][yy]!=-)continue;
vd[xx][yy]=vd[u.first][u.second]+;
q.push(make_pair(xx,yy));
}
}
}
void prim(int u0){
int i,j,mi,v,ans=;
for(i=;i<n;++i) low[i]=g[u0][i];
low[u0]=-;
for(i=;i<n-;++i){
mi=inf;
v=-;
for(j=;j<n;++j)
if(low[j]!=-&&low[j]<mi){
v=j; mi=low[j];
}
ans+=low[v];
low[v]=-;
for(j=;j<n;++j){
if(g[v][j]<low[j]){
low[j]=g[v][j];
}
}
}
printf("%d\n",ans);
}
int main(){
int t,i,j;
scanf("%d",&t);
while(t--){
scanf("%d%d",&x,&y);
gets(mp[]);
for(i=;i<y;++i) gets(mp[i]);
n=;
for(i=;i<y;++i){
for(j=;j<x;++j){
if(mp[i][j]=='A'||mp[i][j]=='S')
G[i][j]=n++;
else G[i][j]=-;
}
}
for(i=;i<y;++i)
for(j=;j<x;++j)
if(G[i][j]>) bfs(i,j);
prim();
}
return ;
}
最小生成树练习3(普里姆算法Prim)的更多相关文章
- hdu 1233:还是畅通工程(数据结构,图,最小生成树,普里姆(Prim)算法)
还是畅通工程 Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submis ...
- 最小生成树---普里姆算法(Prim算法)和克鲁斯卡尔算法(Kruskal算法)
普里姆算法(Prim算法) #include<bits/stdc++.h> using namespace std; #define MAXVEX 100 #define INF 6553 ...
- 查找最小生成树:普里姆算法算法(Prim)算法
一.算法介绍 普里姆算法(Prim's algorithm),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之 ...
- ACM第四站————最小生成树(普里姆算法)
对于一个带权的无向连通图,其每个生成树所有边上的权值之和可能不同,我们把所有边上权值之和最小的生成树称为图的最小生成树. 普里姆算法是以其中某一顶点为起点,逐步寻找各个顶点上最小权值的边来构建最小生成 ...
- 图->连通性->最小生成树(普里姆算法)
文字描述 用连通网来表示n个城市及n个城市间可能设置的通信线路,其中网的顶点表示城市,边表示两城市之间的线路,赋于边的权值表示相应的代价.对于n个定点的连通网可以建立许多不同的生成树,每一棵生成树都可 ...
- 普里姆算法(Prim)
概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图(带权图)里搜索最小生成树.即此算法搜索到的边(Edge)子集所构成的树中,不但包括了连通图里的所有顶点(Vertex)且其所有边的权 ...
- 普里姆(Prim)算法
概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图(即"带权图")里搜索最小生成树.即此算法搜索到的边(Edge)子集所构成的树中,不但包括了连通图里的所有顶点(V ...
- HDU 1879 继续畅通工程 (Prim(普里姆算法)+Kruskal(克鲁斯卡尔))
继续畅通工程 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- Prim算法(普里姆算法)
描述: 一个连通图的生成树是指一个极小连通子图,它含有图中的全部顶点,但只有足以构成一棵树的 n-1 条边.我们把构造连通网的最小代价生成树成为最小生成树.而Prim算法就是构造最小生成树的一种算法. ...
随机推荐
- [HDOJ5938]Four Operations(暴力,DFS)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5938 题意:给出一个长度最大是2020的数字串, 你要把数字串划分成55段, 依次填入'+', '-' ...
- Java编程思想读书笔记
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- python 自动生成C++代码 (代码生成器)
python 代码自动生成的方法 (代码生成器) 遇到的问题 工作中遇到这么一个事,需要写很多C++的底层数据库类,但这些类大同小异,无非是增删改查,如果人工来写代码,既费力又容易出错:而借用pyth ...
- react入门笔记
this.props.children是任何内嵌的元素 利用ref属性给子组件命名,this.refs引用组件,getDOMNode()获取本地的DOM元素,如: this.refs.author.g ...
- [转]-用Gradle 构建你的android程序
出处:http://www.cnblogs.com/youxilua 前言 android gradle 的插件终于把混淆代码的task集成进去了,加上最近,android studio 用的是gr ...
- Android Fast ImageLoader
前段时间写的Android平台开源项目:Fast ImageLoader,现在分享给大家 源码地址:https://github.com/cumtkangyi/Android-Fast-ImageLo ...
- maven之详解继承与聚合
说到聚合与继承我们都很熟悉,maven同样也具备这样的设计原则,下面我们来看一下Maven的pom如何进行聚合与继承的配置实现. 一.为什么要聚合? 随着技术的飞速发展和各类用户对软件的要求越来越高, ...
- .net 连接sqlserver类库
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Da ...
- caffe的data_reader.cpp分析一下干了点什么
首先说明:下面的内容不一定对 类body: 变量:LayerParameter param_ :它里面放的是:body传进来的layerparameter的参数: BlockingQueue<s ...
- 转:Eric Lippert:阅读代码真的很难
转自:http://blog.jobbole.com/438/ 相关文章 微软资深软件工程师:阅读代码真的很难(第2篇) 阅读优秀代码是提高开发人员修为的一种捷径 学会阅读源代码 如何阅读大型代码库? ...