Kruskal:


#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std; //#define debug
#if defined debug
#define CDBG(format,...) printf("File: "__FILE__", Line: %05d: "format"\n", __LINE__, ##__VA_ARGS__)
int open_file(){
FILE *fp ;
if((fp = freopen("input3.txt","r",stdin)) == NULL){
CDBG("error in freopen");
return -;
}
CDBG("success in freopen");
return ;
}
#else
#define CDBG(format,...) do{}while(0)
#endif #define N 510
int n,k,pre[N];
struct point
{
int x;
int y;
int len;
}p[N*N];
/*int cmp(const void * x,const void * y)
{
return ((point*)x)->len>((point*)y)->len?1:-1;
}*/ void swap(point &x,point &y)
{
point temp;
temp = x;
x = y;
y = temp; // 从指针改成数组就行了
} int choose_pivot(int i,int j )
{
return((i+j) /);
} void quicksort(point list[],int m,int n)
{
int key,i,j,k;
if( m < n)
{
k = choose_pivot(m,n);
    if(m != k)
swap(list[m],list[k]);
key = list[m].len;
i = m+;
j = n;
while(i <= j)
{
while((i <= n) && (list[i].len <= key)) i++;
while((j >= m) && (list[j].len > key)) j--;
if( i < j)
swap(list[i],list[j]);
}
// 交换两个元素的位置
    if(m != j)
swap(list[m],list[j]);
// 递归地对较小的数据序列进行排序
quicksort(list,m,j-);
quicksort(list,j+,n); } } int cmp(point x,point y)
{
return x.len<y.len;
}
int find(int x)
{
while(x!=pre[x]) x=pre[x];
return x;
}
void kruskal()
{
int i,mix,a,b;
mix=;
//sort(p,p+k,cmp);
for(i = ; i < k ;i++)
CDBG("%d ",p[i].len);
quicksort(p,,k-); //跟 sort 结果完全不一样
for(i = ; i < k ;i++)
CDBG("%d ",p[i].len);
for(i=;i<=n;i++)
pre[i]=i;// 可以初始化为 -1 等值
for(i=;i<k;i++)
{
a=find(p[i].x);
b=find(p[i].y);
if(a!=b)
{
if(p[i].len>mix)
mix=p[i].len;
pre[b]=a;
}
}
cout<<mix<<endl;
}
void input()
{
scanf("%d",&n);
k=;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
scanf("%d",&p[k].len);
if(i != j && p[k].len != ){
p[k].x=i;
p[k].y=j;
k++; //过滤掉ii 点
}
}
}
int main()
{
int T;
#ifdef debug
if(open_file() != )
return -;
#endif
scanf("%d",&T);
while(T--)
{
input();
kruskal();
}
return ;
}
 void quicksort(int left, int right){

    if (left > right)
return;
int l = left;
int r = right+;
path v, temp;
v = ipath[left]; while (){
while (l < r && ipath[--r].len >= v.len);
while (l < r && ipath[++l].len <= v.len);
if (l >= r) break;
temp = ipath[l];
ipath[l] = ipath[r];
ipath[r] = temp;
} ipath[left] = ipath[l];
ipath[l] = v;
quicksort(left, l - );
quicksort(l + , right);
}

Prime:

参考: http://www.cnblogs.com/biyeymyhjob/archive/2012/07/30/2615542.html
/*
题目意思就是求最小生成树,并返回最长edge
求最小生成树一般有两种方法,prim算法 O[N^2]和kruskal算法 O[ElogE],在这里我推荐使用prim算法,因为此题不是稀疏图,kruskal算法耗时较多(但也不会超时)
prim算法的基本思想
1.清空生成树,任取一个顶点加入生成树
2.在那些一个端点在生成树里,另一个端点不在生成树里的边中,选取一条权最小的边,将它和另一个端点加进生成树
3.重复步骤2,直到所有的顶点都进入了生成树为止,此时的生成树就是最小生成树
Prime()
{
//开始默认把1加入点集里
for(2~m)
dist[i]=map[1][i];
for(2~m)
{
//找跟相连的最短边
for(2~m)
{
if(!visit[j] && dist[j]<inf)
index="j";
}=""
visit[index]="1";
 根据知道的点更新cost,这里方法有点像dijkstra,注意!!!=""
for(2~m)="" {="" if(!visit[j]="" &&="" cost[j]="">map[index][j])
cost[j]=map[index][j];
}
}
}
*/
#include<stdio.h>
#include<string.h> #define debug
#if defined debug
#define CDBG(format,...) printf("File:"__FILE__", Line:%05d: "format"\n", __LINE__, ##__VA_ARGS__)
#else
#define CDBG(format,...) do{}while(0)
#endif #define N 511
// n -> [3,500]
#define inf 0x3f3f3f3f
//distance -> [1,65536] int villages[N][N];
int visited[N];
int lowcost[N]; int open_file(){
FILE *fp ;
if((fp = freopen("input3.txt","r",stdin)) == NULL){
CDBG("error in freopen");
return -;
}
CDBG("success in freopen");
return ;
} void reset_visited(int n){
int i = ;
for( i = ; i<= n; i++){ visited[i] = ; lowcost[i] = ;}
}
//下面2个方法都可以
int prim(int start_p,int n){
int i,j,pos,min = ,result = ;
reset_visited(n);
//start at point 1
visited[start_p] = ; pos = start_p;
//set low array from point 1 to other point
for(i = ; i <= n; i++)
if(i != pos) {
lowcost[i] = villages[pos][i];
CDBG("set lowcost[%d] = %d",i,lowcost[i]);
}
//check n-1 times again , 每次添加一个点到 最小树
for(i = ; i < n; i++){ // 使用 while循环代替 for 容易有一些问题
//find min distance 寻找下一个最短距离
min = inf;
for(j = ; j <= n; j++){
if(visited[j] == && lowcost[j] < min)
{
min = lowcost[j];//从未访问的点找到 最短距离的 点
            pos = j;
CDBG("min = %d pos = %d j = %d",min,pos,j);
}
}
CDBG("min = %d pos = %d ",min,pos);
//add min distance;
if(result < min)
result = min; // 找最小树的最长距离 visited[pos] = ;
//update 更新当前最小的点 到 所有未访问过的点 的距离
for(j = ; j <= n; j++){
if(visited[j] == && lowcost[j] > villages[pos][j])
{
lowcost[j] = villages[pos][j];
CDBG("update lowcost[%d] = %d",j ,lowcost[j]);
}
}
}
return result;
} int prim(int n)
{
int u = ;
int i,j,k,start,min,max;
//memset(vis,0,sizeof(vis));
reset_visited(n);
for(i=;i<=n;i++)
if(i!=u)
lowcost[i]=villages[][i];
visited[]=true;
k=;
min=;max=;
for(i=;i<n;i++) //n-1条边
{
min=inf;
for(j=;j<=n;j++)
if(lowcost[j]<min&&!visited[j])
{
min=lowcost[j];
k=j;
}
if(min>max)
max=min;
visited[k]=true;
for(j=;j<=n;j++)
if(lowcost[j]>villages[k][j]&&!visited[j])
{
lowcost[j]=villages[k][j];
}
}
return max;
//cout<<max<<endl;
} void read_villages(int n){
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++)
{
villages[i][j] = ;
scanf("%d",&villages[i][j]);
}
}
void check_villages(int n){
for(int i = ; i <= n; i++){
for(int j = ; j <= n; j++)
printf("%d ",villages[i][j]); // 应该是这个导致了 Output Limit Exceeded
printf("\n");
}
}
int main(){
int T,n;
#ifdef debug
if(open_file() != )
return -;
#endif scanf("%d",&T);
while(T--){
scanf("%d",&n);
read_villages(n);
//check_villages(n);
int ans=;
ans = prim(,n); // 可以从任意一点开始
//ans = prim(n);
printf("%d\n",ans);
} return ;
}

poj2485 kruskal与prim的更多相关文章

  1. 最小生成树——Kruskal与Prim算法

    最小生成树——Kruskal与Prim算法 序: 首先: 啥是最小生成树??? 咳咳... 如图: 在一个有n个点的无向连通图中,选取n-1条边使得这个图变成一棵树.这就叫“生成树”.(如下图) 每个 ...

  2. 关于最小生成树 Kruskal 和 Prim 的简述(图论)

    模版题为[poj 1287]Networking. 题意我就不说了,我就想简单讲一下Kruskal和Prim算法.卡Kruskal的题似乎几乎为0.(●-`o´-)ノ 假设有一个N个点的连通图,有M条 ...

  3. HDU 1102 最小生成树裸题,kruskal,prim

    1.HDU  1102  Constructing Roads    最小生成树 2.总结: 题意:修路,裸题 (1)kruskal //kruskal #include<iostream> ...

  4. 稀疏图(邻接链表),并查集,最短路径(Dijkstra,spfa),最小生成树(kruskal,prim)

    全部函数通过杭电 1142,1162,1198,1213等题目测试. #include<iostream> #include<vector> #include<queue ...

  5. 稠密图(邻接矩阵),并查集,最短路径(Dijkstra,spfa),最小生成树(kruskal,prim)

    全部函数通过杭电 1142,1162,1198,1213等题目测试. #include<iostream> #include<vector> #include<queue ...

  6. Kruskal和Prim算法求最小生成树

    Kruskal算法求最小生成树 测试数据: 5 6 0 1 5 0 2 3 1 2 4 2 4 2 2 3 1 1 4 1 输出: 2 3 1 1 4 1 2 4 2 0 2 3 思路:在保证不产生回 ...

  7. 最小生成树 kruskal算法&prim算法

    (先更新到这,后面有时间再补,嘤嘤嘤) 今天给大家简单的讲一下最小生成树的问题吧!(ps:本人目前还比较菜,所以最小生成树最后的结果只能输出最小的权值,不能打印最小生成树的路径) 本Tianc在刚学的 ...

  8. 最小生成树(kruskal模版 Prim模板)

    http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2144&cid=1186 最小生成树,最重要的是了解思想 稠密图用Prim,稀疏图用Kru ...

  9. 最小生成树(Kruskal和Prim算法)

    关于图的几个概念定义:          关于图的几个概念定义: 连通图:在无向图中,若任意两个顶点vi与vj都有路径相通,则称该无向图为连通图. 强连通图:在有向图中,若任意两个顶点vi与vj都有路 ...

随机推荐

  1. Swift 语法篇

    一.输出语句 print("Hello World") print("Hello World 11", "Hello World 22", ...

  2. MySql连接Visual studio Code First插件

    到mySql官网Downloads==> MySQL on Windows==>MySQL for Visual Studio 下载插件安装即可

  3. H5 FormData对象的使用

    XMLHttpRequest Level2 添加了一个新的接口--FormData .[ 主要用于发送表单数据,但也可以独立使用于传输键控数据.与普通的Ajax相比,它能异步上传二进制文件 ] 利用F ...

  4. 修改XCode的Product的输出目录(有时不生效需看)

    通常在情一般都不建议使用绝对路径,因为写死之后,换环境,换平台,又要重新修改路径,因此常常使用相对路径,哪么相对路径通常使用的就是环境变量了. 在Mac 中,xcode 中build settings ...

  5. 79. Word Search

    使用的别人的思路,用一个二维数组记录每一个位置是否用过,然后通过递归来判断每一个位置是否符合 public class Solution { public boolean exist(char[][] ...

  6. (转载)在Visual Studio 2015中使用Git

    原文:http://blog.csdn.net/damon316/article/details/51885802 1. VS2015在对Git的支持 VS2015是微软IDE集成开发环境的重量级升级 ...

  7. LeetCode Paint House

    原题链接在这里:https://leetcode.com/problems/paint-house/ 题目: There are a row of n houses, each house can b ...

  8. SpringMVC常用配置-文件上传-基于Servlet 3.0

    [2] http://www.cnblogs.com/weilu2/p/springmvc_MultipartConfigElement_tomcat_webapps_work.html

  9. Global Mapper Lidar点云分类

    Global Mapper Lidar Module还挺厉害的,自动分类的效果很不错. 首先去除地面点,用的是形态学滤波方法. 之后可以分类出建筑物.低中高树木.电力线路. https://www.b ...

  10. zstack 离线升级1.1到 1.2 rc

    说明 zstack版本1.1是通过离线安装的. 升级过程 1 挂载下一个版本的zstack的社区版本centos镜像 ZStack-Community-x86_64-DVD-1.2.0.iso mkd ...