首页 > 代码库 > POJ 2485 Highways
POJ 2485 Highways
题意:给你一个数n,代表有n个村庄,然后要你输入n行n列个数,第i行的第j个元素代表i村与j村的距离,要你求出连通n个村庄所需修的最短路所需要的最大边
思路:用Kruskal算法求
AC代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define N 125000 //最多的边数为n*(n-1)/2 int u[N],v[N],w[N],r[N]; int f[520],str[520][520]; int find(int x) { if(x!=f[x]) f[x]=find(f[x]); return f[x]; } int cmp(const int x,const int y) //间接排序距离 { return w[x]<w[y]; } int main() { int x,y,sum,e,i,j,n,t,maxx; scanf("%d",&t); while(t--) { scanf("%d",&n); int cnt=0; memset(str,0,sizeof(str)); for(i=1;i<=n;i++) for(j=1;j<=n;j++) { int val; scanf("%d",&val); if(val==0) continue; if(!(str[i][j]&&str[j][i])) { u[cnt]=i; v[cnt]=j; w[cnt++]=val; str[i][j]=str[j][i]=1; } } for(i=0;i<=n;i++)f[i]=i; for(i=0;i<=cnt;i++)r[i]=i; sort(r,r+cnt,cmp); sum=0; maxx=0; for(i=0;i<=cnt;i++) { e=r[i]; x=find(u[e]); y=find(v[e]); if(x!=y){ maxx=max(maxx,w[e]); f[x]=y; } } printf("%d\n",maxx); } }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。