poj3625 Building Roads(最小生成树)

来源:互联网 发布:房租占收入比例 知乎 编辑:程序博客网 时间:2024/04/24 02:18

拿到题就想到强连通分量和最小生成树,肿么搞都是RE或MLE,结果这只是一道prim最小生成树。。。

把已给边赋值为-1,这样每次在选边时就先选它了。

#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>using namespace std;#define inf 0x3f3f3f3fstruct node{int x,y;}edge[1500];int n,m;double map[1500][1500];double fun(int x1,int x2,int y1,int y2){return sqrt((double)(x1-x2)*(x1-x2)+(double)(y1-y2)*(y1-y2));//注意转换成double}double d[1500];int vis[1500];void prim(){for(int i=1;i<=n;i++){d[i]=map[1][i];}memset(vis,0,sizeof(vis));d[1]=(double)0;vis[1]=1;double tmp;int v;for(int i=1;i<=n;i++){tmp=(double)inf;for(int j=1;j<=n;j++){if(!vis[j]&&d[j]<tmp){tmp=d[j];v=j;}}vis[v]=1;for(int j=1;j<=n;j++){if(!vis[j]&&d[j]>map[v][j]){d[j]=map[v][j];}}}double ans=(double)0;for(int i=1;i<=n;i++){if(d[i]==(double)-1)continue;ans+=d[i];}printf("%.2f\n",ans);}int main(){scanf("%d %d",&n,&m);for(int i=1;i<=n;i++){scanf("%d %d",&edge[i].x,&edge[i].y);}for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){map[j][i]=map[i][j]=fun(edge[i].x,edge[j].x,edge[i].y,edge[j].y);}}for(int i=1;i<=m;i++){int a,b;scanf("%d %d",&a,&b);map[a][b]=map[b][a]=(double)-1;}prim();}


0 0
原创粉丝点击