zoukankan      html  css  js  c++  java
  • hpuoj 问题 C: 善良的国王【最小生成树kurskal】

    问题 C: 善良的国王

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 112  解决: 48
    [提交][状态][讨论版]

    题目描述

    很久很久以前,有一个贫困的国家,这个国家有一个善良爱民的国王,但是国运维艰,这个国家总是不得不面对这天灾的严峻挑战,又一次连月的大雨,引发了洪水,洪水冲断了道路,水褪去后也有很多村庄成为了孤岛,善良的国王爱民如子,于是他想从本不富足的税收中拿出一部分钱,来给这些村庄修道路,但是国力有限,不能修复所有的道路,于是国王决定,保证村庄两两之间可以到达就好。现在国王想知道他要建的道路中最长的最少要多长。

    输入

    输入包含多组测试数据,每组测试数据首先输入一个n,表示有n个村庄3 <= n <= 500,编号为1-n,然后下边一个n*n的矩阵,第i行第j列的值,表示标号i到编号j的村庄的距离是这个值,单位1~65536

    输出

    输出国王要建的道路中最长的最少的长度。

    样例输入

    3
    0 990 692
    990 0 179
    692 179 0

    样例输出

    692

    简单最小生成树,求出最小生成树中的最长边:用kurskal算法在加边时多写一个用于求最长边的步骤即可用 prime算法也是如此,这里就不写prime了
    kurskal算法:
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #define MAX 1100
    #define maxn(x,y)(x>y?x:y)
    #define INF 0x3f3f3f
    using namespace std;
    int n,k,maxx;
    int set[MAX],map[MAX][MAX];
    struct node
    {
    	int b;
    	int e;
    	int m;
    }s[MAX];
    bool cmp(node a,node b)
    {
    	return a.m<b.m;
    }
    int find(int fa)
    {
        if(fa==set[fa])
        return fa;
    	return set[fa]=find(set[fa]); 
    }
    void mix(int x,int y)
    {
    	int fx=find(x);
    	int fy=find(y);
    	if(fx!=fy)
    	set[fx]=fy;
    }
    void init()
    {
    	int i,j;
    	for(i=1;i<=n;i++)
    	    set[i]=i;
    }
    
    void getmap()
    {
    	int i,j;
    	memset(map,0,sizeof(map));
    	for(i=1;i<=n;i++)
    	{
    		for(j=1;j<=n;j++)
    		{
    			scanf("%d",&map[i][j]);
    		}
    	}
    	for(i=1;i<=n;i++)
    	for(j=i+1;j<=n;j++)
    	{
    		if(map[i][j]>0)
    		{
    			s[k].b=i;
    			s[k].e=j;
    			s[k++].m=map[i][j];
    		}
    	}
    }
    
    void solve()
    {
    	int i,j;
    	sort(s,s+k,cmp);
    	for(i=0;i<k;i++)
    	{
    		if(find(s[i].b)!=find(s[i].e))
    		{
    			mix(s[i].b,s[i].e);
    			maxx=maxn(maxx,s[i].m);
    		}
    	}
    	printf("%d
    ",maxx);
    }
    int main()
    {
    	int i,j;
    	while(scanf("%d",&n)!=EOF)
    	{
    		k=0;maxx=0;
    		init();
    		getmap();
    		solve();
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    [daily][troubleshoot][archlinux][wps][font] wps文档中的图内容无法显示中文
    [troubleshoot][daily][archlinux][pacman] pacman 与 pip 包文件冲突
    [daily] 宇宙终极shell之zsh
    [knowledge][basic][hardware] 内存的硬件结构(转)
    [troubleshoot][archlinux][X] GPU HANG
    [daily]使用rdtsc指令,测量程序的运行速度 [转]
    [have_fun] 好玩哒小游戏又来啦
    [dpdk] 读开发指南(2)(内容长期整理中)
    [Virtualization][SDN] 讲的很好的SDN软件定义网络视频课程
    [Virtualization][SDN] VXLAN到底是什么 [转]
  • 原文地址:https://www.cnblogs.com/tonghao/p/4732572.html
Copyright © 2011-2022 走看看