poj 2485

来源:互联网 发布:淘宝活动代码 编辑:程序博客网 时间:2024/06/18 15:12

水题

求最小生成树的最大边

改一下条件就行

prim

#include<cstdio>#include<iostream>#include<cstring>#include<iostream>using namespace std;const int INF=0x3f3f3f;bool used[505];int mincost[505];int cost[505][505];int prim(int n){for(int i=1;i<=n;i++)mincost[i]=INF;memset(used,false,sizeof(used));int ans=0;mincost[1]=0;for(int i=1;i<=n;i++){int v=-1;for(int u=1;u<=n;u++)if(!used[u]&&(v==-1||mincost[u]<mincost[v])) v=u;if(v==-1) break;used[v]=true;ans=max(ans,mincost[v]);for(int u=1;u<=n;u++)mincost[u]=min(mincost[u],cost[u][v]); }return ans;}int main(){int t;scanf("%d",&t);while(t--){int n,dd;scanf("%d",&n);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){scanf("%d",&dd);cost[i][j]=dd;}printf("%d\n",prim(n));} } 
kruskal

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;struct edge{int u,v,cost;}es[505*505];bool cmp(edge a,edge b){return a.cost<b.cost;}int f[505];int Find(int x){if(x==f[x]) return x;return f[x]=Find(f[x]);}int Unite(int x,int y){int fx=Find(x);int fy=Find(y);f[fx]=fy;}int kruskal(int e,int n){sort(es,es+e,cmp);for(int i=1;i<=n;i++)f[i]=i;int ans=0;for(int i=0;i<e;i++){edge ee=es[i];if(Find(ee.u)!=Find(ee.v)){Unite(ee.u,ee.v);ans=max(ans,ee.cost);}}return ans;}int main(){int t;scanf("%d",&t);while(t--){int n,dd,e=0;scanf("%d",&n);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){scanf("%d",&dd);es[e].u=i; es[e].v=j; es[e].cost=dd; e++;}}printf("%d\n",kruskal(e,n));} }