题目:
链接:点击打开链接
题意:
中文
算法:
最小生成树的prim算法。
思路:
对map数组按条件初始化即可,用一个标记变量判断能否实现全部畅通即可。
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
#define MAX 100000000
#define MAXN 110
double map[MAXN][MAXN];
double low[MAXN];
int vis[MAXN];
int x[MAXN],y[MAXN];
int n;
double prim()
{
int pos;
double minn;
double result = 0;
int ok = 1;
memset(vis,0,sizeof(vis));
pos = 1;
vis[pos] = 1;
for(int i=1; i<=n; i++)
{
if(i != pos)
low[i] = map[pos][i];
}
for(int i=1; i<n; i++)
{
minn = MAX;
for(int j=1; j<=n; j++)
{
if(!vis[j] && minn > low[j])
{
minn = low[j];
pos = j;
}
}
if(minn == MAX)
{
ok = 0;
break;
}
result += minn;
vis[pos] = 1;
for(int j=1; j<=n; j++)
{
if(!vis[j] && map[pos][j]<low[j])
low[j] = map[pos][j];
}
}
if(ok)
printf("%.1f\n",result*100);
else
printf("oh!\n");
}
int main()
{
//freopen("input.txt","r",stdin);
int t;
double xx,yy,dis;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
scanf("%d%d",&x[i],&y[i]);
for(int i=1; i<=n; i++)//map的初始化
{
for(int j=1; j<=i; j++)
{
xx = (x[i] - x[j])*(x[i] - x[j]);
yy = (y[i] - y[j])*(y[i] - y[j]);
dis = sqrt(xx + yy);
if(dis < 10 || dis > 1000)
map[j][i] = map[i][j] = MAX;
else
map[j][i] = map[i][j] = dis;
}
}
prim();
}
return 0;
}