poj3625 Building Roads(最小生成树)
2015-08-19 18:47
260 查看
拿到题就想到强连通分量和最小生成树,肿么搞都是RE或MLE,结果这只是一道prim最小生成树。。。
把已给边赋值为-1,这样每次在选边时就先选它了。
把已给边赋值为-1,这样每次在选边时就先选它了。
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; #define inf 0x3f3f3f3f struct 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(); }
相关文章推荐
- 详解图的应用(最小生成树、拓扑排序、关键路径、最短路径)
- 最小生成树算法之Prim算法
- 使用C语言实现最小生成树求解的简单方法
- 最小生成树算法——Prim和Kruskal算法的实现
- Data Structure - Week 15
- poj 2485 Highways
- Kruskal 最小生成树
- 最小生成树
- 图的最小生成树学习笔记
- 克如斯卡尔算法--最小生成树
- 普里姆算法--最小生成树
- HDU-1233 还是畅通工程(最小生成树&并查集)
- 最小生成树之prim算法
- 最小生成树 : Kruskal 算法
- 最小生成树 : Prim 算法
- java数据结构 最小生成树
- POJ1251-Jungle Roads
- POJ1287-Networking
- 最小生成树——HDOJ 1863 畅通工程 解题报告
- 最小生成树——HDOJ 1233 还是畅通工程 解题报告