POJ1751 Highways【最小生成树】
题意:
给你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; }