无定根的最小树形图,像网络流的超级源和超级汇一样加一个起点,用邻接表(n>1000)

n<1000用邻接矩阵

#include<map>
#include<set>
#include<ctime>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pi acos(-1)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define MIN(a,b) a<b ? a:b using namespace std; const double g=10.0,eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f3f; int in[N],vis[N],Hash[N];
int pre[N];
int ans,ansnum;
struct edge{
int u,v,w;
}e[maxn];
int dirmst(int root,int nv,int ne)
{
ans=;
while(){
memset(in,inf,sizeof in);
for(int i=;i<ne;i++)
{
int u=e[i].u,v=e[i].v;
if(e[i].w<in[v]&&v!=u)
{
in[v]=e[i].w;//找最小入边
pre[v]=u;//记录前驱
if(u==root)ansnum=i;
}
}
// cout<<ansnum<<endl;
in[root]=;
for(int i=;i<nv;i++)
if(in[i]==inf)
return ;//如果不能构成最小树形图
int cntnum=;
memset(vis,-,sizeof vis);
memset(Hash,-,sizeof Hash);
for(int i=;i<nv;i++)
{
ans+=in[i];
int v=i;
while(vis[v]!=i&&v!=root&&Hash[v]==-)vis[v]=i,v=pre[v];
if(v!=root&&Hash[v]==-)//有环
{
for(int u=pre[v];u!=v;u=pre[u])
Hash[u]=cntnum;
Hash[v]=cntnum++;
}
}
if(cntnum==)return ;//没有环
for(int i=;i<nv;i++)
if(Hash[i]==-)
Hash[i]=cntnum++;//缩点
for(int i=;i<ne;i++)
{
int v=e[i].v;
e[i].u=Hash[e[i].u];//重新编号
e[i].v=Hash[e[i].v];
if(e[i].u!=e[i].v)e[i].w-=in[v];//因为前面已经将in[v]加到ans中了
}
nv=cntnum;
root=Hash[root];
}
return ;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie();
int n,m;
while(cin>>n>>m){
int sum=;
for(int i=;i<m;i++)
{
int a,b,c;
cin>>a>>b>>c;
e[i].u=a;e[i].v=b;e[i].w=c;
sum+=c;
}
int s=m;
for(int i=;i<n;i++)
{
e[s].u=n;
e[s].v=i;
e[s].w=sum+;//为了只有一个节点与root相连
s++;
}
ansnum=;
if(!dirmst(n,n+,n+m)||ans>=*sum+)cout<<"impossible"<<endl;
else cout<<ans-sum-<<" "<<ansnum-m<<endl;
cout<<endl;
}
return ;
}

hdu2121无定根的最小树形图的更多相关文章

  1. hdu2121 最小树形图的虚根

    /* 最小树形图的第二题,终于有了一些理解 具体看注释 */ /* 无定根的最小树形图 建立虚root 每次只找最短的那条入边 最小树形图理解: 第一步:寻找最短弧集E:扫一遍所有的边,找到每个点权值 ...

  2. hdu2121 Ice_cream’s world II 最小树形图(难)

    这题比HDU4009要难一些.做了4009,大概知道了最小树形图的解法.拿到这题,最直接的想法是暴力.n个点试过去,每个都拿来做一次根.最后WA了,估计是超时了.(很多题都是TLE说成WA,用了G++ ...

  3. hdu 2121 Ice_cream’s world II (无定根最小树形图)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2121 题目大意: 有n个点,有m条单向路,问这n个点组成最小树形图的最小花费. 解题思路: 1:构造 ...

  4. HDU - 2121 Ice_cream’s world II 无根最小树形图

    HDU - 2121 :http://acm.hdu.edu.cn/showproblem.php?pid=2121 比较好的朱刘算法blog:https://blog.csdn.net/txl199 ...

  5. HDU ACM 2121 Ice_cream’s world II (无根最小树形图)

    [解题思路]这题先看了NotOnlySuccess的解题思路,即设置虚根再处理的做法:弄了一个上午,再次有种赶脚的感觉~~如果需要找出为什么需要去比所有权值之和更大的数为新增的虚边的话,一开始我理解仅 ...

  6. POJ 3164——Command Network——————【最小树形图、固定根】

    Command Network Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 15080   Accepted: 4331 ...

  7. HDU2121 Ice_cream’s world II —— 最小树形图 + 不定根 + 超级点

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2121 Ice_cream’s world II Time Limit: 3000/1000 MS (J ...

  8. 【UVA 11865】 Stream My Contest (二分+MDST最小树形图)

    [题意] 你需要花费不超过cost元来搭建一个比赛网络.网络中有n台机器,编号0~n-1,其中机器0为服务器,其他机器为客户机.一共有m条可以使用的网线,其中第i条网线的发送端是机器ui,接收端是机器 ...

  9. 树的问题小结(最小生成树、次小生成树、最小树形图、LCA、最小支配集、最小点覆盖、最大独立集)

    树的定义:连通无回路的无向图是一棵树. 有关树的问题: 1.最小生成树. 2.次小生成树. 3.有向图的最小树形图. 4.LCA(树上两点的最近公共祖先). 5.树的最小支配集.最小点覆盖.最大独立集 ...

随机推荐

  1. 理解tomcat之搭建简易http服务器

    做过java web的同学都对tomcat非常熟悉.我们在使用tomcat带来的便利的同时,是否想过tomcat是如何工作的呢?tomcat本质是一个http服务器,本篇文章将搭建一个简单的http服 ...

  2. usr/bin/ld: cannot find 错误解决方法和 /etc/ld.so.conf

    我makefile出现这个错误: HelloWorldServer.c:(.text+0xaa): undefined reference to `zmq_send'collect2: error: ...

  3. PHP计算上一个月最后一天、当月最后一天、下一个月最后一天

    上个月最后一天: $last_month_last_day = date('Y-m-t',strtotime('-1 month')); 当月最后一天: $first_day=date('Y-m-01 ...

  4. TOSCA自动化测试工具安装

    1.下载链接 https://www.tricentis.com/software-testing-tools/ 2.免费试用14天, 弹出的页面输入邮箱地址--> 输入一堆信息-->点击 ...

  5. iis日志时间与本地日期不一样

    iis日志里面的时间是 UTC时间,所以要自已加时区进行转换:即 utc时间+8小时:

  6. 获取 config文件的节点值

    System.Configuration.ConfigurationManager.AppSettings["followTemplate"];

  7. CF1153E Serval and Snake(交互题)

    题目 CF1153E Serval and Snake 很有意思的一道交互题 做法 我们观察到,每次查询一行,当这一行仅包含一端是返回的答案是奇数 根据这个性质查询每一行每一列,我们大体能知道两端的位 ...

  8. hadoop namenode HA集群搭建

    hadoop集群搭建(namenode是单点的)  http://www.cnblogs.com/kisf/p/7456290.html HA集群需要zk, zk搭建:http://www.cnblo ...

  9. Linux文件系统学习(一)之相关概念⭐⭐⭐

    “一切皆是文件”是 Unix/Linux 的基本哲学之一.不仅普通的文件,目录.字符设备.块设备.套接字等在 Unix/Linux 中都是以文件被对待:它们虽然类型不同,但是对其提供的却是同一套操作界 ...

  10. Java 设计模式六原则及23中常用设计模式

    一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接 ...