2021-02-01
系列文章目录
前言
水一篇代码(最小生成树)
#include
using namespace std;
const int maxn=110;
struct edge
{
int u,v,w;
bool operator < (const edge &r)const{
return w<r.w;
}
}e[maxn*maxn];
int n,m,f[maxn];
int find(int x){
return x==f[x]?x:f[x]=find(f[x]);
}
void kruskal(int n,int m){
int res=0,num=0;
sort(e+1,e+1+m);
for(int i=1;i<=n;i++) f[i]=i;
for (int i = 1; i <= m; i++)
{
int f1=find(e[i].u),f2=find(e[i].v);
if (f1!=f2)
{
num++;
res+=e[i].w;
f[f1]=f2;
}
if (num==n-1)
break;
}
if (num==n-1) printf("%d\n",res);
else puts("?");
}
int main(){
while (scanf("%d%d",&m,&n),m)
{
for(int i=1;i<=m;i++)
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
kruskal(n,m);
}
}
#include
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=110;
int n;
double d[maxn][maxn],min,dis[maxn];
int vis[maxn];
struct zh
{
int x,y;
}a[maxn];
double di(int i,int j){
return sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)*1.0+(a[i].y-a[j].y)*(a[i].y-a[j].y)*1.0);
}
int main()
{
int T;
cin>>T;
while (T--)
{
int k=1;
double s=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
}
for (int i = 1; i <=n; i++)
{
for (int j = 1; j <=n; j++)
{
d[i][j]=d[j][i]=di(i,j);
if(d[i][j]<10||d[i][j]>1000)
d[i][j]=d[j][i]=inf;
}
}
for (int i = 1; i <= n; i++)
{
dis[i]=d[1][i];
}
memset(vis,0,sizeof(vis));
vis[1]=1;
int t=0;
for (int i = 1; i < n; i++)
{
double min=inf;
for (int j = 1; j <= n; j++)
{
if (!vis[j]&&dis[j]<min)
{
min=dis[j];
k=j;
}
}
if(min==inf) break;
t++;
vis[k]=1;
s+=min;
for (int j = 1; j <= n; j++)
{
if(!vis[j]&&dis[j]>d[j][k])
dis[j]=d[j][k];
}
}
if(t==n-1)
printf("%.1lf\n",s*100);
else
printf("oh!\n");
}
}