社区讨论
60分 prim算法求助!!!!思路简单代码清晰,但是不会
P2872[USACO07DEC] Building Roads S参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lo7pmkx6
- 此快照首次捕获于
- 2023/10/27 05:42 2 年前
- 此快照最后确认于
- 2023/10/27 05:42 2 年前
CPP
#include<bits/stdc++.h>
using namespace std;
const double PI=acos(-1);
//#define int long long
#define double long double
#define endl '\n'
const int N=1010;
const double inf=0x3f3f3f3f;
double g[N][N];
double dist[N];
bool st[N];
int n,m;
double prim(){
for(int i=1;i<=n;i++) dist[i]=1e9;
double res=0;
for(int i=0;i<n;i++){
int t=-1;
for(int j=1;j<=n;j++){//选距离最少的点
if(!st[j]&&(t==-1||dist[t]>dist[j]))
t=j;
}
if(i&&dist[t]==inf) return inf ;
if(i) res+=dist[t];//更新前 如果不是第一个点就加入到距离里面
for(int j=1;j<=n;j++) dist[j]=min(dist[j],g[t][j]);
st[t]=true;//加入到集合
}
return res;
}
#define pii pair<int,int>
pii p[N];
#define x first
#define y second
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
int a,b;cin>>a>>b;
p[i]={a,b};
}
for(int i=1;i<=n;i++){//求两点之间的距离
for(int j=1;j<=n;j++)
if(i!=j)
g[i][j]=sqrt((p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y) );
else g[i][j]=1e9;
}
while(m--){
int a,b;cin>>a>>b;
double c=0;
g[a][b]=g[b][a]=min(c,g[a][b]);;//联通直接变为0
}
double t=prim();
printf("%.2Lf",t);
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...