就是求最小生成树中那条最大的边。。。。
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
#define MAX 65550
int map[505][505];
int dis[505];
bool s[505];
int prim(int n)
{
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
scanf("%d",&map[i][j]);
s[0] = true;
for(int j =1; j<n; j++)
{
dis[j] = map[0][j];
s[j] = false;
}
int ans = 0;
for(int i=1; i<n; i++)
{
int min = MAX, rec;
for(int j=0; j<n; j++)
if(!s[j]&&dis[j]<min)
{
min = dis[j];
rec = j;
}
s[rec] = true;
if(ans<min&&min!=MAX) ans = min;
for(int j =0; j<n; j++)
if(!s[j]&&dis[j]>map[rec][j])
dis[j] = map[rec][j];
}
printf("%d\n",ans);
}
int main()
{
int ca, n;
scanf("%d",&ca);
while(ca--)
{
scanf("%d",&n);
prim(n);
}
system("pause");
return 0;
}
刚又试了下另一个算法,不过一直提示runtime error 。。。。不知道怎么搞的。。
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
#define MAX 65550
typedef struct node
{
int c1, c2, cost;
}node;
node rode[1200];
int father[505];
int compare(const node &a, const node &b)
{
return a.cost<b.cost;
}
int init()
{
for(int i=0; i<505; i++)
father[i] = i;
return 1;
}
int find(int n)
{
if(n!=father[n])
{
father[n] = find(father[n]);
}
return father[n];
}
int megre(int n1, int n2)
{
int a = find(n1);
int b = find(n2);
if(a==b) return 0;
if(a<b)father[n1] = n2;
else father[n2] = n1;
return 1;
}
void kurscal(int n)
{
init();
int k =0;
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
{
rode[k].c1 = i;
rode[k].c2 = j;
scanf("%d",&rode[k].cost);
if(i==j) rode[k].cost = MAX;
k++;
}
sort(rode,rode+k,compare);
int ans =0;
for(int i=0; i<k; i++)
{
if(megre(rode[i].c1,rode[i].c2))
ans = rode[i].cost;
}
printf("%d\n",ans);
}
int main()
{
int ca, n;
scanf("%d",&ca);
while(ca--)
{
scanf("%d",&n);
kurscal(n);
}
system("pause");
return 0;
}