标签:
Time Limit: 1000MS | Memory Limit: 10000K | |||
Total Submissions: 13182 | Accepted: 3814 | Special Judge |
Description
Input
Output
Sample Input
9 1 5 0 0 3 2 4 5 5 1 0 4 5 2 1 2 5 3 3 1 3 9 7 1 2
Sample Output
1 6 3 7 4 9 5 7 8 3
【题意】给你N个城市的坐标,城市之间存在公路,但是由于其中一些道路损坏了,需要维修,维修的费用与公路长成正比(公路是直的)。
但现有M条公路是完整的,不需要维修,下面有M行,表示不需要维修的道路两端的城市,问最短费用。
【分析】一道典型的最小生成树题,lowcost[i]数组存还未处理的城市i离已经处理过的城市的最短距离,pre[i]]数组存还未处理的
城市i离已经处理过的哪个城市最近。
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <climits> #include <cstring> #include <string> #include <set> #include <map> #include <queue> #include <stack> #include <vector> #include <list> #include<functional> #define mod 1000000007 #define inf 0x3f3f3f3f #define pi acos(-1.0) using namespace std; typedef long long ll; 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)printf("%d %d\n",pre[k],k); 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(~scanf("%d",&n)) { for(int i=1; i<=n; i++) { scanf("%d%d",&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; } scanf("%d",&m); for(int i=0; i<m; i++) { int ita,itb; scanf("%d%d",&ita,&itb); edg[ita][itb]=edg[itb][ita]=0; } Prim(); } return 0; }
标签:
原文地址:http://www.cnblogs.com/jianrenfang/p/5731698.html