POJ3164 Command Network 最小树形图

最小树形图,就是给有向带权图中指定一个特殊的点root,求一棵以root为根的有向生成树T,并且T中所有边的总权值最小。

朱刘算法模板题

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <stack>
#include <queue>
#include <cmath>
#include <vector>
using namespace std;
typedef long long LL;
const int N=1e2+5;
const int INF=0x3f3f3f3f;
struct Node{
  double x,y;
}p[N];
struct Edge{
    int u,v;
    double w;
}edge[N*N];
double in[N];
int id[N],vis[N],pre[N],n,m;
double dis(int u,int v){
   double x=p[u].x-p[v].x,y=p[u].y-p[v].y;
   return sqrt(x*x+y*y);
}
double zhuliu(int rt,int n,int m){
     double ret=0;
     while(1){
     for(int i=1;i<=n;++i)in[i]=INF;
     for(int i=1;i<=m;++i){
        if(edge[i].u!=edge[i].v&&edge[i].w<in[edge[i].v]){
            pre[edge[i].v]=edge[i].u;
            in[edge[i].v]=edge[i].w;
        }
     }
     for(int i=1;i<=n;++i)
     if(i!=rt&&in[i]==INF)return -1;
     int cnt=0;
     memset(id,-1,sizeof(id));
     memset(vis,-1,sizeof(vis));
     in[rt]=0;
     for(int i=1;i<=n;++i){
        ret+=in[i];
        int v=i;
        while(vis[v]!=i&&id[v]==-1&&v!=rt){
            vis[v]=i;
            v=pre[v];
        }
        if(v!=rt&&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=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-=in[v];
     }
     n=cnt;
     rt=id[rt];
     }
     return ret;
}
int main()
{
    while(~scanf("%d%d",&n,&m)){
        for(int i=1;i<=n;++i)scanf("%lf%lf",&p[i].x,&p[i].y);
        for(int i=1;i<=m;++i){
          scanf("%d%d",&edge[i].u,&edge[i].v);
          edge[i].w=INF;
          if(edge[i].u!=edge[i].v)edge[i].w=dis(edge[i].u,edge[i].v);
        }
        double ans=zhuliu(1,n,m);
        if(ans<0)printf("poor snoopy\n");
        else printf("%.2f\n",ans);
    }
    return 0;
}

时间: 2024-10-09 21:25:30

POJ3164 Command Network 最小树形图的相关文章

poj Command Network 最小树形图

规定根节点,求一颗生成树使得权值最小,但由于是有向图,所以最小生成树算法失效. 查资料后得知此类问题叫做最小树形图. 解决最小树形图问题的朱刘算法,算法核心基于找 [最小弧集->找环,消环缩点] 的思想,来慢慢构造树形图. 所有的灵魂都在这张图上.0.0 注意缩点后的弧权值的处理 #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algo

poj3134 Command Network --- 最小树形图

新单词unidirectional get T T 求有向图上,以某点为根的,最小生成树 参考别人的模板 #include<cstdio> #include<cstring> #include<vector> #include<queue> #include<iostream> #include<algorithm> #include<cmath> #define inf 2000000000 using namespac

POJ 3164 Command Network 最小树形图-朱刘算法裸题

题目来源:POJ 3164 Command Network 题意:求以1为根的最小树形图 没有输出字符串 思路:直接高朱刘算法 不懂的可以百度 学会了就是直接套模板的事情 其实就是不断消圈而已 不构成圈就有解 无法从根到达其他点就无解 #include <cstdio> #include <cstring> #include <cmath> const int maxn = 110; const int maxm = 50010; const double INF =

【POJ3164】Command Network 最小树形图模板题 重修版

链接: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/44935891"); } 我以前的版本 算法构造过程以及傻叉代码+弱版注释见以前博客 http://blog.csdn.net/vmurder/article/details/38819711 最小树形图: 名词解释: 其实就是有向图

POJ 3164 Command Network(最小树形图)

Command Network Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 13817   Accepted: 3973 Description After a long lasting war on words, a war on arms finally breaks out between littleken’s and KnuthOcean’s kingdoms. A sudden and violent a

POJ 3164 Command Network (最小树形图-朱刘算法)

题目地址:POJ 3164 最小树形图第一发. 把一个v写成u了.....TLE了一晚上...(虽说今晚出去玩了..) 刚开始看这个算法的时看模板以为又是一个isap....吓得一个哆嗦.但是仔细看了看之后发现还是挺好理解的.写下自己的理解. 朱刘算法其实只有3步,然后不断循环. 1:找到每个点的最小入边.既然是生成树,那么对于每个点来说,只要选一个权值最小的入边就可以了.贪心思想.因为如果不是最小入边,那么它肯定不是最小树形图的一条边,考虑它是没有意义的. 2:找环.找环找的是最小入边构成的新

POJ3164 Command Network 【最小树形图】

Command Network Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 12648   Accepted: 3656 Description After a long lasting war on words, a war on arms finally breaks out between littleken's and KnuthOcean's kingdoms. A sudden and violent a

POJ3164 Command Network【最小树形图】【朱刘算法】

Command Network Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 13398 Accepted: 3868 Description After a long lasting war on words, a war on arms finally breaks out between littleken's and KnuthOcean's kingdoms. A sudden and violent assau

POJ - 3164-Command Network 最小树形图——朱刘算法

POJ - 3164 题意: 一个有向图,存在从某个点为根的,可以到达所有点的一个最小生成树,则它就是最小树形图. 题目就是求这个最小的树形图. 参考资料:https://blog.csdn.net/txl199106/article/details/62045479 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <strin