zoukankan      html  css  js  c++  java
  • 最小生成树

    最小生成树

    POJ-1287-Networking

    http://poj.org/problem?id=1287

    最小生成树问题,可用Prim算法,也可用Kruskal算法

    Prim算法是基于顶点来实现最小生成树,Kruskal算法是基于边来实现最小生成树

    Prime算法,用java写的

    import java.util.Scanner;
    //无穷大量
    class MAX
    {
    	static int num=0x3f3f3f3f;
    }
    class prime{
    	int n;
    	int[][] map=new int[105][105];
    	int[] dis=new int[105];
    	int[] visit=new int[105];
    	public void init(int[][] a,int m)
    	{
    		n=m;
    		for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++)
    		{
    			map[i][j]=a[i][j];
    		}
    		for(int i=1;i<=n;i++)
    		visit[i]=0;
    		visit[1]=1;
    		for(int i=1;i<=n;i++)
    		dis[i]=map[1][i];
    		dis[1]=0;
    	}
    	public int solve()
    	{
    		int i,j,Min,v,sum=0;
    		//每次加入一个节点
    		for(i=1;i<n;i++)
    		{
    			Min=MAX.num;
    			v=0;
    			for(j=1;j<=n;j++)
    			if(visit[j]==0&&dis[j]<Min)
    			{
    				Min=dis[j];
    				v=j;
    			}
    			sum+=Min;
    			visit[v]=1;
    			for(j=1;j<=n;j++)
    			if(visit[j]==0&&dis[j]>map[v][j])
    			dis[j]=map[v][j];
    		}
    		return sum;
    	}
    }
    public class Main{
    	public static void main(String args[])
    	{
    		int nn,m;
    		int[][] mapp=new int[105][105];
    		Scanner t=new Scanner(System.in);
    		while(true)
    		{
    			//初始化为无穷大
    			for(int i=0;i<105;i++)
    			for(int j=0;j<105;j++)
    			mapp[i][j]=MAX.num;
    			nn=t.nextInt();
    			if(nn==0)
    			break;
    			m=t.nextInt();
    			int a,b,c;
    			for(int i=0;i<m;i++)
    			{
    				a=t.nextInt();
    				b=t.nextInt();
    				c=t.nextInt();
    				if(mapp[a][b]>c)
    				mapp[a][b]=mapp[b][a]=c;
    			}
    			prime s=new prime();
    			s.init(mapp,nn);
    			System.out.println(s.solve());
    		}
    		t.close();
    	}
    }
    

    Kruskal算法,用C写的

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<math.h>
    struct bian
    {
    	int x; //起点
    	int y; //终点
    	int len; //距离
    }list[2005];
    int f[105];
    int n,m;//n个点,m条边
    int cmp(const void *a,const void *b)
    {
    	return (*(struct bian *)a).len-(*(struct bian *)b).len;
    }
    void init()
    {
    	int i;
    	for(i=1;i<=n;i++)
    	f[i]=i;
    }
    int find(int x)
    {
    	int r=x;
    	while(f[r]!=r)
    	r=f[r];
    	f[x]=r;
    	return r;
    }
    int Union(int x,int y)
    {
    	int fx,fy;
    	fx=find(x);
    	fy=find(y);
    	if(fx!=fy)
    	{
    		f[fy]=fx;
    		return 1;
    	}
    	return 0;
    }
    int main()
    {
    	int i,t,ans,num;
    	while(scanf("%d",&n),n)
    	{
    		scanf("%d",&m);
    		t=0;
    		for(i=0;i<m;i++)
    		{
    			scanf("%d %d %d",&list[i].x,&list[i].y,&list[i].len);
    		}
    		qsort(list,m,sizeof(struct bian),cmp);
    		ans=0;
    		num=0;
    		init();
    		for(i=0;i<m;i++)
    		{
    			if(Union(list[i].x,list[i].y))
    			{
    				ans+=list[i].len;
    				num++;
    				if(num==n-1)
    				break;
    			}
    			else
    			continue;
    		}
    		printf("%d
    ",ans);
    	}
    	return 0;
    }
    



  • 相关阅读:
    [Leetcode] 221. Maximal Square
    [翻译] TensorFlow Programmer's Guide之Frequently Asked Questions(问得频率最多的几个问题)
    [Kaggle] dogs-vs-cats之模型训练
    [Kaggle] dogs-vs-cats之建立模型
    [Kaggle] dogs-vs-cats之制作数据集[1]
    Linux虚拟机Centos 设置固定的静态IP
    linux IP动态变动之后 , 需要做的杂项操作
    GitBlit (1)-- 在linux 安装 GitBlit 并运行
    Linux 安装SVN
    微信开发(3) -- 支付后接收回调信息测试
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3143171.html
Copyright © 2011-2022 走看看