题意是求最小生成树中的最大边。
来人。。。上模板。。。
kruscal代码:(612k...235ms)
#include<stdio.h>
#include<algorithm>
using namespace std;
const int MaxN = 501;
int n, p;
int fa[MaxN];
struct edge
{
int x, y, w;
bool operator<(const edge &b)const
{
return w < b.w;
}
}e[MaxN * MaxN];
int find(int x)
{
if(fa[x] != x)
fa[x] = find(fa[x]);
return fa[x];
}
int kruscal()
{
int res = -1;
sort(e, e + p);
for(int i = 0; i < n; i++)
fa[i] = i;
for(int i = 0; i < p; i++)
{
int t1 = find(e[i].x);
int t2 = find(e[i].y);
if(t1 != t2)
{
fa[t2] = t1;
res = max(res, e[i].w);
}
}
return res;
}
int main()
{
int ncases;
scanf("%d", &ncases);
while(ncases--)
{
scanf("%d", &n);
p = 0;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
scanf("%d", &e[p].w);
e[p].x = i;
e[p].y = j;
p++;
}
}
int ans = kruscal();
printf("%d\n", ans);
}
return 0;
}
prim代码:(528k...172ms)
#include<stdio.h>
#include<algorithm>
using namespace std;
const int MaxN = 501;
const int INF = 0x3f3f3f3f;
int g[MaxN][MaxN];
int n;
int prim()
{
bool vis[MaxN];
int dis[MaxN];
int res = -1;
for(int i = 1; i <= n; i++)
{
vis[i] = false;
dis[i] = INF;
}
dis[1] = 0;
vis[1] = true;
int mark = 1;
for(int i = 1; i < n ; i++)
{
for(int j = 1; j <= n; j++)
{
if(!vis[j] && dis[j] > g[mark][j])
{
dis[j] = g[mark][j];
}
}
int mindis = INF;
for(int j = 1; j <= n; j++)
{
if(!vis[j] && mindis > dis[j])
{
mindis = dis[j];
mark = j;
}
}
vis[mark] = true;
res = max(res, dis[mark]);
}
return res;
}
int main()
{
int ncases;
scanf("%d", &ncases);
while(ncases--)
{
scanf("%d", &n);
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
scanf("%d", &g[i][j]);
}
}
int ans = prim();
printf("%d\n", ans);
}
return 0;
}