水题
求最小生成树的最大边
改一下条件就行
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));
}
}