poj 1751 Highways
2012-03-30 20:06
405 查看
// 题意: n个点,给出一些边(x,y),表示已经连接起来,新建一些边,使得任意两点间连通 // 问新建哪些边使得施工量最小 // 思路: 就是最小生成树问题,把已经连接在一起的顶点的距离设为0 #include<iostream> //最小生成树prim算法 using namespace std; #define inf 0x7fffffff const int MAXN=760; //最大顶点数 int n,edge[MAXN][MAXN]; //n记录顶点数 int pos[MAXN][2]; struct MST //最小生成树的边 { int s,t,w; }mst[MAXN]; int dist2(int i,int j) { int x=pos[i][0]-pos[j][0]; int y=pos[i][1]-pos[j][1]; return x*x+y*y; } int q[MAXN]; void Prim() { int rear=0,i,j,k; for(i=0;i<n-1;i++) //顶点下标从0开始,默认选择顶点0加入生成树 { mst[i].s=0;mst[i].t=i+1; mst[i].w=edge[0][i+1]; } for(i=0;i<n-1;++i) //求n-1条边 { int min_w=inf; for(j=i;j<n-1;++j) { if(mst[j].w<min_w) //求最小权值边 { min_w=mst[j].w; k=j; } } swap(mst[k],mst[i]); //最小边移至前端 if(mst[i].w!=0) //说明是新建的边 { q[rear++]=i; //记录新建的边 } int v=mst[i].t; for(j=i+1;j<n-1;++j) //更新后面的边 { int wei=edge[v][mst[j].t]; if(wei<mst[j].w) { mst[j].w=wei; mst[j].s=v; } } } for(i=0;i<rear;++i) printf("%d %d\n",mst[q[i]].s+1,mst[q[i]].t+1); } int main() { cin>>n; for(int i=0;i<n;++i) { cin>>pos[i][0]>>pos[i][1]; } for(int i=0;i<n;++i) { edge[i][i]=0; for(int j=i+1;j<n;++j) { edge[i][j]=edge[j][i]=dist2(i,j); } } int m,x,y; cin>>m; while(m--) { cin>>x>>y; x--; y--; edge[x][y]=edge[y][x]=0; } Prim(); return 0; }
相关文章推荐
- poj 1751 highways
- poj-1751-Highways-(最小生成树)
- POJ 1751 Highways
- POJ:1751 Highways
- POJ 1751 Highways(最小生成树+剪枝)
- POJ 1751 Highways【最小生成树+输出路径】
- POJ - 1751 Highways(最小生成树 prim算法)
- poj 1751 Highways(Kruskal)
- POJ 1751 Highways(最小生成树Prim普里姆,输出边)
- POJ1751-Highways
- 【POJ】-1751-Highways(最小生成树)(未知权值)
- POJ-1751 Highways
- poj 1751 Highways (prim和kruskal)
- poj---1751 Highways
- poj 1751 highways
- poj1751 Highways(最小生成树)
- poj 1751 Highways
- POJ 1751 Highways (最小生成树)
- poj 1751 Highways(Kruskal)
- POJ1751 Highways(最小生成树,Kruskal模板题)