题意:输入n个城镇相互之间的距离,输出将n个城镇连通费用最小的方案中修的最长的路的长度
这个也是最小生成树的题,仅仅只是要求的不是最小价值,而是最小生成树中的最大权值。仅仅须要加个推断
比較最小生成树每条边的大小即可
kruskal算法
#include<cstdio> #include<algorithm> using namespace std; int f[510],n,m; struct stu { int a,b,c; }t[20100]; int cmp(struct stu x,struct stu y) { return x.c<y.c; } int find(int x) { if(x!=f[x]) f[x]=find(f[x]); return f[x]; } int krus() { int i,k=0,s=0,x,y; for(i=1;i<m;i++){ x=find(t[i].a); y=find(t[i].b); if(x!=y){ if(t[i].c>s) //比較最小生成树中权值的大小 s=t[i].c; k++; if(k==n-1) break; f[x]=y; } } return s; } int main() { int T,i,j,c,s=0; scanf("%d",&T); while(T--){ scanf("%d",&n); m=1; for(i=1;i<=n;i++){ f[i]=i; for(j=1;j<=n;j++){ scanf("%d",&c); if(j<i){ t[m].a=i; t[m].b=j; t[m++].c=c; } } } sort(t+1,t+m,cmp); s=krus(); printf("%d ",s); } return 0; }
prim算法
#include<stdio.h> #include<string.h> int n,map[505][505],vis[505],low[505]; int prim() { int i,j,min,pos,k=-1; memset(vis,0,sizeof(vis)); pos=1; vis[pos]=1; for(i=1;i<=n;i++) low[i]=map[pos][i]; for(i=1;i<n;i++){ min=99999; for(j=1;j<=n;j++) if(!vis[j]&&low[j]<min){ min=low[j]; pos=j; } if(min>k) k=min; vis[pos]=1; for(j=1;j<=n;j++) if(!vis[j]&&map[pos][j]<low[j]) low[j]=map[pos][j]; } return k; } int main() { int T,i,j,s; scanf("%d",&T); while(T--){ scanf("%d",&n); for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%d",&map[i][j]); s=prim(); printf("%d ",s); } return 0; }