poj 2485 Highway(Kruskal)

来源:互联网 发布:知轩藏书百度网盘 编辑:程序博客网 时间:2024/06/06 13:24


稍微变形了一下,这次是让求最小生成树中最长的那一条的长度,克鲁斯卡尔很方便的,克鲁斯卡尔就是对边进行操作

的,对边进行排序,普里姆算法是对点进行操作的,求出了每个点到其他点的距离,这道题中There is an empty line 

after each test case这句话我怎么觉得它是打出一个空行呢,就是每两个例子之间用空行分开,但是加了后会PE,好

吧,可能是我理解错了吧,直接复制上题的kruskal,忘了改数组范围了,RE了一次,越来越觉得最小生成树的算法就

是一个固定的模式,没有多大的变通。。。

kruskal :

#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct{int i,j;int len;}node;int ans;node map[300000];int p[600];int cmp(const void *a,const void *b){return ((node*)a)->len-((node*)b)->len;}int find(int x){return p[x]==x?x:p[x]=find(p[x]);}void kruskal(){int sum=0;int max=0; for(int i=1;i<ans;i++){int x=find(map[i].i);int y=find(map[i].j);if(x!=y){if(map[i].len>max)max=map[i].len;p[x]=y;}}printf("%d\n",max);}int main(){int n,i,j,c,m;scanf("%d",&m);while(m--){scanf("%d",&n);ans=1;memset(map,0,sizeof(map));memset(p,0,sizeof(p));for(i=1;i<=n;i++)p[i]=i;for(i=1;i<=n;i++)for(j=1;j<=n;j++){scanf("%d",&c);if(c!=0){ map[ans].i=i; map[ans].j=j; map[ans++].len=c;    }}qsort(map+1,ans-1,sizeof(map[0]),cmp);kruskal();}} 


0 0
原创粉丝点击