码迷,mamicode.com
首页 > Web开发 > 详细

poj 3164 Command Network

时间:2015-06-11 22:30:39      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

  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;
}

 

poj 3164 Command Network

标签:

原文地址:http://www.cnblogs.com/alihenaixiao/p/4570131.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!