标签:
题目链接:
http://poj.org/problem?id=3164
#include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn = 110; const int N = 10010; const double Exp = 1e-10; const int INF = 0x3f3f3f3f; struct Point { double x, y; double length(Point a) { return sqrt((a.x-x)*(a.x-x)+(a.y-y)*(a.y-y)); } }; struct Edge { int u, v; double w; }; Point point[maxn]; Edge edge[N]; int n, m; double directed_MST (int root) { double pre[maxn], ans = 0; int vis[maxn], id[maxn], pr[maxn]; int u, v; while (true) { for (int i=1; i<=n; i++) pre[i] = INF; for (int i=0; i<m; i++) { u = edge[i].u; v = edge[i].v; if (edge[i].w<pre[v] && u!=v) { pre[v] = edge[i].w; pr[v] = u; } } for (int i=1; i<=n; i++) { if (i == root) continue; if (pre[i] == INF) return -1; } memset (vis, -1, sizeof(vis)); memset (id, -1, sizeof(id)); int cru = 1; pre[root] = 0; for (int i=1; i<=n; i++) { ans += pre[i]; v = i; while (vis[v]!=i && id[v]==-1 && v!=root) { vis[v] = i; v = pr[v]; } if (v!=root && id[v]==-1) { for (u=pr[v]; u!=v; u=pr[u]) id[u] = cru; id[u] = cru ++; } } if (cru == 1) break; for (int i=1; i<=n; i++) if (id[i] == -1) id[i] = cru ++; for (int i=0; i<m; i++) { u = edge[i].u; v = edge[i].v; edge[i].u = id[u]; edge[i].v = id[v]; if (id[u] != id[v]) edge[i].w -= pre[v]; } n = cru - 1; root = id[root]; //printf ("*****%.2f\n", ans); } return ans; } int main () { while (scanf ("%d %d", &n, &m) != EOF) { for (int i=1; i<=n; i++) scanf ("%lf %lf", &point[i].x, &point[i].y); for (int i=0; i<m; i++) { int u, v; scanf ("%d %d", &u, &v); edge[i].u = u; edge[i].v = v; if (u == v) edge[i].w = INF; else edge[i].w = point[u].length(point[v]); } double num = directed_MST(1); if (num+1< Exp) printf ("poor snoopy\n"); else printf ("%.2f\n", num); } return 0; }
标签:
原文地址:http://www.cnblogs.com/alihenaixiao/p/4570131.html