1. 程式人生 > >POJ1751 Highways【最小生成樹】

POJ1751 Highways【最小生成樹】

數組 != ont class color 生成 size end ron

題意:

給你N個城市的坐標,城市之間存在公路,但是由於其中一些道路損壞了,需要維修,維修的費用與公路長成正比(公路是直的)。

但現有M條公路是完整的,不需要維修,下面有M行,表示不需要維修的道路兩端的城市,問最短費用。

思路:

lowcost[i]數組存還未處理的城市i離已經處理過的城市的最短距離,pre[i]]數組存還未處理的城市i離已經處理過的哪個城市最近。

代碼:

prime:

#include <iostream>
#include <cstdio>
#define inf 0x3f3f3f3f

using namespace std;

const int N=10005
; const int M=15005; int n,m,k,edg[N][N],x[N],y[N],lowcost[N],pre[N]; void Prim() { for(int i=1;i<=n;i++) { lowcost[i]=edg[1][i]; pre[i]=1; } lowcost[1]=-1; for(int i=1;i<n;i++) { int minn=inf; for(int j=1;j<=n;j++) { if(lowcost[j]!=-1&&lowcost[j]<minn) { minn
=lowcost[j]; k=j; } } if(lowcost[k]!=0) cout<<pre[k]<<" "<<k<<endl; lowcost[k]=-1; for(int j=1;j<=n;j++) { if(edg[j][k]<lowcost[j]) { lowcost[j]=edg[j][k]; pre[j]=k; } } } }
int main() { while(cin>>n) { for(int i=1; i<=n; i++) { cin>>x[i]>>y[i]; for(int j=1; j<i; j++) edg[i][j]=edg[j][i]=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]); edg[i][i]=inf; } cin>>m; for(int i=0; i<m; i++) { int a,b; cin>>a>>b; edg[a][b]=edg[b][a]=0; } Prim(); } return 0; }

POJ1751 Highways【最小生成樹】