题解 最小生成树 POJ 1751
题意:给N和N个城市的坐标,M个两个城市间已搭建的桥,求用最少的距离搭桥使N个城市连接在一起。
做法:用prim最小生成树,和并查集。将每个节点的父亲节点记录下来用于输出。
代码:
#include <iostream> #include <cstdio> #include <cstring> #define INF 0xFFFFFF using namespace std; struct xoy{int x, y;}; const int MAX=10000; int v[MAX],a[MAX][MAX],dis[MAX]; xoy dot[MAX]; int n,m; void prim() { v[1]=1; int i,in[MAX]; for(i=1;i<=n;i++) { dis[i]=a[1][i]; in[i]=1; } for(int k=1;k<n;k++) { int minn=INF; int point=0; for(i=1;i<=n;i++) { if((!v[i])&&dis[i]<minn) { minn=dis[i],point=i; } } if(minn!=0) printf("%d %d\n",point,in[point]); v[point]=1; dis[point]=INF; if(point!=0) { for(i=1;i<=n;i++) if(!v[i]&&dis[i]>a[point][i]) {dis[i]=a[point][i];in[i]=point;} } } } int main() { int x,y,i,j; memset(v,0,sizeof(v)); scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d%d",&dot[i].x,&dot[i].y); } for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { a[i][j]=(dot[i].x-dot[j].x)*(dot[i].x-dot[j].x)+(dot[i].y-dot[j].y)*(dot[i].y-dot[j].y); } } scanf("%d",&m); for(i=1;i<=m;i++) { scanf("%d%d",&x,&y); a[x][y]=a[y][x]=0; } prim(); return 0; }
错误:WA 设置INF过小