朱刘算法模版
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#include <vector>
using namespace std;
struct node
{
int u, v, next;
double w;
}e[20001];
double x[101], y[101];
int n, m;
double directedmst()
{
int root = 1;
double ans = 0;
double in[101];
int id[101], pre[101], vis[101];
for (;;)
{
for (int i = 1; i <= n; i++)
in[i] = 1e9;
for (int i = 1; i <= m; i++)
if (e[i].w < in[e[i].v] && e[i].u != e[i].v)
pre[e[i].v] = e[i].u, in[e[i].v] = e[i].w;
for (int i = 1; i <= n; i++)
{
if (i == root)
continue;
if (in[i] == 1e9)
return -1;
}
int cnt = 0;
memset(id, -1, sizeof(id));
memset(vis, -1, sizeof(vis));
in[root] = 0;
for (int i = 1; i <= n; i++)
{
ans += in[i];
int v = i;
while (vis[v] != i && id[v] == -1 && v != root)
{
vis[v] = i;
v = pre[v];
}
if (root != v && id[v] == -1)
{
cnt++;
for (int u = pre[v]; u != v; u = pre[u])
id[u] = cnt;
id[v] = cnt;
}
}
if (cnt == 0)
break;
for (int i = 1; i <= n; i++)
if (id[i] == -1)
id[i] = ++cnt;
for (int i = 1; i <= m; i++)
{
int u = e[i].u, v = e[i].v;
e[i].u = id[u];
e[i].v = id[v];
if (id[u] != id[v])
e[i].w -= in[v];
}
n = cnt;
root = id[root];
}
return ans;
}
int main()
{
while (~scanf("%d %d", &n, &m))
{
for (int i = 1; i <= n; i++)
scanf("%lf %lf", &x[i], &y[i]);
for (int i = 1; i <= m; i++)
{
scanf("%d %d", &e[i].u, &e[i].v);
e[i].w = sqrt((x[e[i].u] - x[e[i].v]) * (x[e[i].u] - x[e[i].v]) + (y[e[i].u] - y[e[i].v]) * (y[e[i].u] - y[e[i].v]));
if (e[i].u == e[i].v)
e[i].w = 1e9;
}
double ans = directedmst();
if (ans == -1)
printf("poor snoopy\n");
else
printf("%.2lf\n", ans);
}
return 0;
}