标签:
链接:
http://poj.org/problem?id=1751
代码:
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> using namespace std; #define N 800 #define INF 0xffffff struct node {int x, y;}a[N]; int n, m, pre[N]; bool used[N][N], vis[N]; double G[N][N], dist[N]; void prim() { int i, j; for(i=1; i<=n; i++) { dist[i] = G[1][i]; pre[i] = 1; } vis[1] = 1; for(i=1; i<n; i++) { int Index = 1; double Min = INF; for(j=1; j<=n; j++) { if(!vis[j] && Min>dist[j]) { Min = dist[j]; Index = j; } } vis[Index] = 1; for(j=1; j<=n; j++) { if(!vis[j] && dist[j] > G[Index][j]) { dist[j] = G[Index][j]; pre[j] = Index; } } } } int main() { while(scanf("%d", &n)!=EOF) { int i, j, u, v; for(i=1; i<=n; i++) scanf("%d%d", &a[i].x, &a[i].y); for(i=1; i<=n; i++) for(j=1; j<=i; j++) G[i][j] = G[j][i] = sqrt(1.0*(a[i].x-a[j].x)*(a[i].x-a[j].x) + (a[i].y-a[j].y)*(a[i].y-a[j].y)); scanf("%d", &m); memset(used, 0, sizeof(used)); for(i=1; i<=m; i++) { scanf("%d%d", &u, &v); G[u][v] = G[v][u] = 0; used[u][v] = used[v][u] = 1; } memset(vis, 0, sizeof(vis)); prim(); for(i=2; i<=n; i++) { if(!used[pre[i]][i] && !used[i][pre[i]]) printf("%d %d\n", i, pre[i]); } } return 0; }
(最小生成树 Prim) Highways --POJ --1751
标签:
原文地址:http://www.cnblogs.com/YY56/p/4732483.html