调了好久,kruskal没过,也没找到原因,用prim过的
prim
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f
const int maxn = 110;
double lowcost[maxn], map[maxn][maxn];
double x[maxn], y[maxn], d;
bool visit[maxn];
int n, m;
int i, j;
void prim()
{
double min, sum = 0; int p = 0;
for (i = 1; i <= n; i++)
lowcost[i] = map[1][i], visit[i] = 0;
visit[1] = 1;
for (i = 2; i <= n; i++)
{
min = inf; p = 0;
for (j = 1; j <= n; j++)
if (!visit[j] && min > lowcost[j])
min = lowcost[j], p = j;
if (min == inf)
{
cout << "oh!" << endl;
return;
}
sum += min; visit[p] = 1;
for (j = 1; j <= n; j++)
if (!visit[j] && lowcost[j] > map[p][j])
lowcost[j] = map[p][j];
}
printf("%.1lf\n", sum * 100);
}
int main()
{
int t; cin >> t;
while (t--)
{
cin >> n;
for (i = 1; i <= n; i++)
{
scanf("%lf %lf", &x[i], &y[i]);
for (j = 1; j <= n; j++)
{
if (i == j)
map[i][j] = 0;
else
map[i][j] = inf;
}
}
for (i = 1; i <= n; i++)
for (j = i + 1; j <= n; j++)
{
d = sqrt((x[i] - x[j])*(x[i] - x[j]) + (y[i] - y[j])*(y[i] - y[j]));
if (d >= 10 && d <= 1000)
{
if (d < map[i][j])
map[i][j] = map[j][i] = d;
}
}
prim();
}
return 0;
}
kruskal
没找到错误。交上去wa
#define mem(a,b) memset(a,b,sizeof(a))
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f;
const int maxn=1010;
int n,m;
struct node
{
int x,y;
double w;
node()
{
}
node(int xx,int yy,float ww)
{
x=xx,y=yy,w=ww;
}
node(int xx,int yy)
{
x=xx,y=yy;
}
};
bool operator <(const node a,const node b)
{
return a.w>b.w;
}
int F[maxn];
int f(int x)
{
if(x!=F[x])
return F[x]=f(F[x]);
return x;
}
bool Union(int x,int y)
{
x=f(x),y=f(y);
if(x!=y)
{
F[x]=y;
return 1;
}
return 0;
}
void ini(int n)
{
for(int i=1; i<=n; ++i)
F[i]=i;
}
int main()
{
int t;
scanf("%d",&t);
node edges[10100];
while(t--)
{
mem(edges,0);
int x,y,z;
scanf("%d",&z);
priority_queue<node>pq;
for(int i=1; i<=z; ++i)
{
scanf("%d%d",&x,&y);
edges[i]=node(x,y);
}
for(int i=1; i<z; ++i)
for(int j=i+1; j<=z; ++j)
pq.push(node(i,j,100*sqrt((edges[i].x-edges[j].x)*(edges[i].x-edges[j].x)+(edges[i].y-edges[j].y)*(edges[i].y-edges[j].y))));
double ans=0;
int cnt=0;
ini(z);
while(!pq.empty())
{
node tt=pq.top();
pq.pop();
//cout<<t.x<<":"<<f(t.x)<<endl;
//cout<<t.y<<":"<<f(t.y)<<endl;
if(tt.w>=1000&&tt.w<=100000)
if(Union(tt.x,tt.y))//cout<<t.w<<" "<<t.x<<" "<<t.y<<endl,
++cnt,ans+=tt.w;
}
//for(int i=0;i<z;++i)
// if(F[i]==i)
// ++cnt;
if(cnt!=z-1)
puts("oh!");
else
printf("%.1f\n",ans);
}
system("pause");
return 0;