uva10397
题目链接请戳 这里
解题思路
数据好像加强了,,,Kruskal过不了(还是我写搓了?)。。。
用Prim吧。把已经存在的边,距离都设为0(反向边也是),这样生成的MST一定
会包含这些边。
代码
#include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #define N 1010 #define INF 1e9+5 using namespace std; struct building { int x, y; }buid[N]; double w[N][N]; int vis[N]; double d[N]; int n; double path(building a, building b) { return sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2)); } double Prim() { memset(vis, 0, sizeof(vis)); double ans = 0; for(int i = 1; i <= n; i++) d[i] = (i == 1 ? 0 : INF); for(int i = 1; i <= n; i++) { int x; double m = INF; for(int y = 1; y <= n; y++) if(!vis[y] && d[y] < m) m = d[x = y]; vis[x] = 1; ans += m; for(int y = 1; y <= n; y++) if(!vis[y]) d[y] = min(d[y], w[x][y]); } return ans; } int main() { while(scanf("%d", &n) != EOF) { for(int i = 1; i <= n; i++) { scanf("%d%d", &buid[i].x, &buid[i].y); } for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) if(i != j) w[j][i] = w[i][j] = path(buid[i], buid[j]); else w[i][j] = INF; int t; scanf("%d", &t); for(int i = 0; i < t; i++) { int a, b; scanf("%d%d", &a, &b); w[a][b] = w[b][a] = 0; } double ans = Prim(); printf("%.2lf\n", ans); } return 0; }