问题 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\n",maxx); } int main() { int i,j; while(scanf("%d",&n)!=EOF) { k=0;maxx=0; init(); getmap(); solve(); } return 0; }
时间: 2024-11-02 10:45:24