首页 > 编程知识 正文

POJ - 1751 Highways (最小生成树)

时间:2023-05-04 14:04:30 阅读:57646 作者:2522

主题:单击以打开链接

题意: n个村子,你必须连接所有的村子。 村子之间的距离是二维坐标系的中点和点的距离。 但是有了一些路,我听说为了连接村子需要重建那些路。

问题)连接最小生成树和已建立的边,然后根据此图重建边。 kruskal () )

代码:

# include iostream # include stdio.h # include algorithm # include string.h # include math.husingnamespacestd; 结构no { int x,y; }node[750 10]; 结构ed { int u,v; 双精度w; }edge[750*750/2 10],edd[1000]; intCMP(EDa,ed b ) { return a.wb.w; (intn,m,cnt; int B[750 10]; intfine(intx ) if ) x!=B[x] ) b[x]=fine(b[x] ); 返回b [ x ]; }void健壮的犀牛(int x,int y ) intxx=fine ) x; intYY=fine(y if(xx!=yy ) B[xx]=yy; }void kru () { int i,j; for(I=0; i m; I ) intxx=fine(edge[I].u ); intYY=fine(edge[I].v ); if(xx!=YY(b[xx]=YY; edd[cnt].u=edge[i].u; //合并时顺便记录了那些变化并合并了。 edd[cnt].v=edge[i].v; edd[cnt ].w=edge[i].w; } }}int main () scanf ) ' %d ',n ); for(intI=1; i=n; I ) b(I )=I; for(intI=1; i=n; I )扫描(“% d % d”,node[i].x,node[i].y ); (m=0; for(intI=1; i=n; I ) { int x1=node[i].x; int y1=node[i].y; for(intj=I1; j=n; j({intx2=node[j].x; int y2=node[j].y; 双精度=sqrt (() *(*(x1-x2 ) ) x1-x2 ) )合适的花生() ) edge[m].u=i; edge[m].v=j; edge[m ].w=d; } } cnt=0; sort(edge,edge m,cmp ); int k; 扫描(' % d ',k ); int a,b; for(intI=0; i k; I ) )//已经修建的道路scanf('%d%d”,a,b ); 健壮的犀牛(a、b ); (kru ); for(intI=0; i cnt; I ) printf('%d%d(n ),EDD (I ).u,edd ).v ); 返回0; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。