最小生成树のprim算法
Problem A
Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 31 Accepted Submission(s) : 10
#include <iostream>
#include <cstring>
using namespace std;
#define MaxInt 0x3f3f3f3f
#define N 110
int map[N][N],low[N],visited[N];
int n;
int prim()
{
int i,j,pos,min,result=0;
memset(visited,0,sizeof(visited));
//从某点开始,分别标记和记录该点
visited[1]=1;pos=1;
//第一次给low数组赋值
for(i=1;i<=n;i++)
if(i!=pos) low[i]=map[pos][i];
//再运行n-1次
for(i=1;i<n;i++)
{
//找出最小权值并记录位置
min=MaxInt;
for(j=1;j<=n;j++)
if(visited[j]==0&&min>low[j])
{
min=low[j];pos=j;
}
if(min==MaxInt) return -1;
//最小权值累加
result+=min;
//标记该点
visited[pos]=1;
//更新权值
for(j=1;j<=n;j++)
if(visited[j]==0&&low[j]>map[pos][j])
low[j]=map[pos][j];
}
return result;
}
int main()
{
int m,i,j,v,ans;
while(cin>>m>>n&&m)
{
//所有权值初始化为最大
memset(map,MaxInt,sizeof(map));
while(m--)
{
cin>>i>>j>>v;
if(i!=j)map[i][j]=map[i][j]=v;
}
ans = prim();
if(ans==-1)cout<<"?"<<endl;
else cout<<ans<<endl;
}
return 0;
}
/********************************/
Problem B
Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 25 Accepted Submission(s) : 14
#include <iostream>
#include <cstring>
using namespace std;
#define MaxInt 0x3f3f3f3f
#define N 110
int map[N][N],low[N],visited[N];
int n;
int prim()
{
int i,j,pos,min,result=0;
memset(visited,0,sizeof(visited));
//从某点开始,分别标记和记录该点
visited[1]=1;pos=1;
//第一次给low数组赋值
for(i=1;i<=n;i++)
if(i!=pos) low[i]=map[pos][i];
//再运行n-1次
for(i=1;i<n;i++)
{
//找出最小权值并记录位置
min=MaxInt;
for(j=1;j<=n;j++)
if(visited[j]==0&&min>low[j])
{
min=low[j];pos=j;
}
if(min==MaxInt) return -1;
//最小权值累加
result+=min;
//标记该点
visited[pos]=1;
//更新权值
for(j=1;j<=n;j++)
if(visited[j]==0&&low[j]>map[pos][j])
low[j]=map[pos][j];
}
return result;
}
int main()
{
int m,i,j,v,ans;
while(cin>>m>>n&&m)
{
//所有权值初始化为最大
memset(map,MaxInt,sizeof(map));
while(m--)
{
cin>>i>>j>>v;
if(i!=j)map[i][j]=map[i][j]=v;
}
ans = prim();
if(ans==-1)cout<<"?"<<endl;
else cout<<ans<<endl;
}
return 0;
}
/********************************************/
Problem C
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 10 Accepted Submission(s) : 8
#include <cmath>
using namespace std;
#define MAX 100010
#define LEN 105
double dist[LEN];
double map[LEN][LEN];
bool isvisited[LEN];
//点的结构体
typedef struct Point
{
double x;
double y;
}Point;
//初始化
void init(){
int i,j;
for(i=0;i<LEN;i++)
{
for(j=0;j<LEN;j++)
{
if(i==j) map[i][j]=0; //对a[][]进行初始化,一般都要;
map[i][j]=MAX;
}
}
}
//计算两点距离
double caculteD(Point a,Point b)
{
double len;
len=sqrt(1.0*(a.x-b.x)*(a.x-b.x)+1.0*(a.y-b.y)*(a.y-b.y));
return len;
}
//prim算法
double prim(int n){
int i,j,min,pos;
double sum=0;
memset(isvisited,false,sizeof(isvisited));
//初始化
for(i=1;i<=n;i++){
dist[i]=map[1][i];
}
//从1开始
isvisited[1]=true;
dist[1]=MAX;
//找到权值最小点并记录下位置
for(i=1;i<n;i++){
min=MAX;
//pos=-1;
for(j=1;j<=n;j++){
if(!isvisited[j] && dist[j]<min)
{
min=dist[j];
pos=j;
}
}
if(min==MAX){
return -1;
}
sum+=dist[pos];//加上权值
isvisited[pos]=true;
//更新权值
for(j=1;j<=n;j++){
if(!isvisited[j] && dist[j]>map[pos][j])
{
dist[j]=map[pos][j];
}
}
}
return sum;
}
int main(){
Point p[105];
int i,j,n,nCase;
cin>>nCase;
double result;//总价
while(nCase--){
cin>>n;
init(); //初始化
for(i=1;i<=n;i++){
scanf("%lf%lf",&p[i].x,&p[i].y);
}
for(i=1;i<n;i++){
for(j=i+1;j<=n;j++){
double len;
len=caculteD(p[i],p[j]);
if(len>=10 && len<=1000){//长度有限制
map[i][j]=map[j][i]=100*len;//要*100
}
}
}
result=prim(n);
if(result==-1){
cout<<"oh!"<<endl;
}
else{
printf("%.1lf\n",result);
}
}
return 0;
}
Problem D
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 15 Accepted Submission(s) : 6
#include <iostream>
#include <cstring>
using namespace std;
#define MaxInt 0x3f3f3f3f
#define N 110
int map[N][N],low[N],visited[N];
int n;
int prim()
{
int i,j,pos,min,result=0;
memset(visited,0,sizeof(visited));
visited[1]=1;pos=1;
for(i=1;i<=n;i++)
if(i!=pos) low[i]=map[pos][i];
for(i=1;i<n;i++)
{
min=MaxInt;
for(j=1;j<=n;j++)
{
if(visited[j]==0&&min>low[j])
{
min=low[j];pos=j;
}
}
if(min!=MaxInt)
result+=min;
visited[pos]=1;
for(j=1;j<=n;j++)
if(visited[j]==0&&low[j]>map[pos][j])
low[j]=map[pos][j];
}
return result;
}
int main()
{
int i,v,j,ans,c,t;
while(scanf("%d",&n)!=EOF&&n)
{
memset(map,MaxInt,sizeof(map));
for(t=1;t<=n*(n-1)/2;t++)
{
scanf("%d%d%d%d",&i,&j,&v,&c);
if(c==0)map[i][j]=map[j][i]=v;
else map[i][j]=map[j][i]=0;
}
ans=prim();
printf("%d\n",ans);
}
return 0;
}
/*******************************/
Problem E
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 6 Accepted Submission(s) : 4
#include <cmath>
using namespace std;
#define MAX 100010
#define LEN 105
double dist[LEN];
double map[LEN][LEN];
bool isvisited[LEN];
//点的结构体
typedef struct Point
{
double x;
double y;
}Point;
//初始化
void init()
{
int i,j;
for(i=0;i<LEN;i++){
for(j=0;j<LEN;j++){
if(i==j) map[i][j]=0; //对a[][]进行初始化,一般都要;
map[i][j]=MAX;
}
}
}
//计算两点距离
double caculteD(Point a,Point b)
{
double len;
len=sqrt(1.0*(a.x-b.x)*(a.x-b.x)+1.0*(a.y-b.y)*(a.y-b.y));
return len;
}
//prim算法
double prim(int n)
{
int i,j,min,pos;
double sum=0;
memset(isvisited,false,sizeof(isvisited));
//初始化
for(i=1;i<=n;i++)
{
dist[i]=map[1][i];
}
//从1开始
isvisited[1]=true;
dist[1]=MAX;
//找到权值最小点并记录下位置
for(i=1;i<n;i++)
{
min=MAX;
//pos=-1;
for(j=1;j<=n;j++){
if(!isvisited[j] && dist[j]<min)
{
min=dist[j];
pos=j;
}
}
if(min==MAX)
{
return -1;
}
sum+=dist[pos];//加上权值
isvisited[pos]=true;
//更新权值
for(j=1;j<=n;j++){
if(!isvisited[j] && dist[j]>map[pos][j])
{
dist[j]=map[pos][j];
}
}
}
return sum;
}
int main()
{
Point p[105];
int i,j,n;
double result;
double len;
while(cin>>n)
{
init(); //初始化
for(i=1;i<=n;i++){
scanf("%lf%lf",&p[i].x,&p[i].y);
}
for(i=1;i<n;i++)
{
for(j=i+1;j<=n;j++)
{
len=caculteD(p[i],p[j]);
map[i][j]=map[j][i]=len;
}
}
result=prim(n);
printf("%.2lf\n",result);
}
return 0;
}
最小生成树のprim算法的更多相关文章
- 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。
//归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...
- 最小生成树Prim算法(邻接矩阵和邻接表)
最小生成树,普利姆算法. 简述算法: 先初始化一棵只有一个顶点的树,以这一顶点开始,找到它的最小权值,将这条边上的令一个顶点添加到树中 再从这棵树中的所有顶点中找到一个最小权值(而且权值的另一顶点不属 ...
- 最小生成树—prim算法
最小生成树prim算法实现 所谓生成树,就是n个点之间连成n-1条边的图形.而最小生成树,就是权值(两点间直线的值)之和的最小值. 首先,要用二维数组记录点和权值.如上图所示无向图: int map[ ...
- Highways POJ-1751 最小生成树 Prim算法
Highways POJ-1751 最小生成树 Prim算法 题意 有一个N个城市M条路的无向图,给你N个城市的坐标,然后现在该无向图已经有M条边了,问你还需要添加总长为多少的边能使得该无向图连通.输 ...
- SWUST OJ 1075 求最小生成树(Prim算法)
求最小生成树(Prim算法) 我对提示代码做了简要分析,提示代码大致写了以下几个内容 给了几个基础的工具,邻接表记录图的一个的结构体,记录Prim算法中最近的边的结构体,记录目标边的结构体(始末点,值 ...
- 图论算法(五)最小生成树Prim算法
最小生成树\(Prim\)算法 我们通常求最小生成树有两种常见的算法--\(Prim\)和\(Kruskal\)算法,今天先总结最小生成树概念和比较简单的\(Prim\)算法 Part 1:最小生成树 ...
- 最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析
最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析 最小生成树,老生常谈了,生活中也总会有各种各样的问题,在这里,我来带你一起分析一下这个算法的思路与实现的方式吧~~ 在考研中呢 ...
- 最小生成树——prim算法
prim算法是选取任意一个顶点作为树的一个节点,然后贪心的选取离这棵树最近的点,直到连上所有的点并且不够成环,它的时间复杂度为o(v^2) #include<iostream>#inclu ...
- 最小生成树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind
最小支撑树树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind 最小支撑树树 前几节中介绍的算法都是针对无权图的,本节将介绍带权图的最小 ...
- 求最小生成树(Prim算法)(1075)
Description 求出给定无向带权图的最小生成树.图的定点为字符型,权值为不超过100的整形.在提示中已经给出了部分代码,你只需要完善Prim算法即可. Input 第一行为图的顶点个数n ...
随机推荐
- 百度地图API简单应用
在做移动端应用时经常用到百度地图API,百度API有强大的示例和文档,开发之前去百度相关网站注册密钥,很块博主只花了几分钟 百度地图API范例 百度地图API文档说明 例子1:输入特定关键字绘制地图标 ...
- Spring BeanNameAutoProxyCreator 与 ProxyFactoryBean区别
一般我们可以使用ProxyBeanFactory,并配置proxyInterfaces,target和interceptorNames实现,但如果需要代理的bean很多,无疑会对spring配置文件的 ...
- php引用
1.需求 了解php引用 2.变量的引用 目前为止看到的引用是变量的引用, 例子1 $a="ABC"; $b =&$a; echo $a;//这里输出:ABC echo $ ...
- 【转】JVM介绍
1. 什么是JVM? JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来 ...
- user initialization list vs constructor assignment
[本文连接] http://www.cnblogs.com/hellogiser/p/user_initialization_list.html [分析] 初始化列表和构造函数内的赋值语句有何区别? ...
- 为WebDriver 设置proxy(IE设置代理)
IE driver String PROXY = "http://proxy:8083"; org.openqa.selenium.Proxy proxy = new org.op ...
- objccn-iOS上的相机捕捉
在第一台iPhone时,在app里面整合相机的唯一方法就是使用UIImagePickerController.到了iOS4,发布了更灵活的AVFoundation框架. UIImagePickerCo ...
- 总是有一个程序的bug没找到
算法训练 Lift and Throw 时间限制:3.0s 内存限制:256.0MB 问题描述 给定一条标有整点(1, 2, 3, ...)的射线. 定义两个点之间的距离为其下标之 ...
- 给包含compid列且值为null ,表的行数据赋值--
IF OBJECT_ID ('dbo.spSelectColValue_In_DB') IS NOT NULL DROP PROCEDURE dbo.spSelectColValue_In_DB go ...
- 使用 lsyncd 本地目录实时备份
转自 https://segmentfault.com/a/1190000002737213 2.1安装lsyncd # rpm -ivh http://dl.fedoraproject.org/pu ...