hdu 2121无根最小树形图要建一个虚拟节点
#include<stdio.h>
#include<string.h>
#define inf 999999999
#define N 1100
struct node {
int u,v,w;
}edge[11000];
int visit[N],dis[N],id[N],pre[N],yong,n,index;
void addedge(int u,int v,int w){
edge[yong].u=u;
edge[yong].v=v;
edge[yong++].w=w;
}
int zhuliu(int root) {//朱刘算法模板
int sum=0;
n++;
while(1) {
int i;
for(i=0;i<n;i++)
dis[i]=inf;
memset(id,-1,sizeof(id));
memset(visit,-1,sizeof(visit));
for(i=0;i<yong;i++) {
int u=edge[i].u,v=edge[i].v;
if(dis[v]>edge[i].w&&u!=v){
pre[v]=u;
dis[v]=edge[i].w;
if(u==root)//记录最后与根节点连接的边
index=i;
}
}
pre[root]=root;
dis[root]=0;
for(i=0;i<n;i++) {
if(i==root)continue;
if(dis[i]==inf)return -1;
sum+=dis[i];
}
int res=0;
for(i=0;i<n;i++)
if(visit[i]==-1) {
int v=i;
while(visit[v]==-1) {
visit[v]=i;
v=pre[v];
}
if(visit[v]!=i||v==root)
continue;
int u;
for(u=pre[v];u!=v;u=pre[u])
id[u]=res;
id[v]=res++;
}
if(res==0)
return sum;
for(i=0;i<n;i++) {
if(id[i]==-1)
id[i]=res++;
}
for(i=0;i<yong;i++) {
edge[i].w-=dis[edge[i].v];
edge[i].u=id[edge[i].u];
edge[i].v=id[edge[i].v];
}
n=res;root=id[root];
}
return sum;
}
int main(){
int m,i,j,k,maxx,mm;
while(scanf("%d%d",&n,&m)!=EOF) {
yong=0;
maxx=0;
mm=m;//记录m
while(m--) {
scanf("%d%d%d",&i,&j,&k);
maxx+=k;//记录最大值
addedge(i,j,k);
}
maxx++;//增1
for(i=0;i<n;i++)//会记录第几次加入的边
addedge(n,i,maxx);//建立一个虚拟节点
k=zhuliu(n);
if(k==-1||k-maxx>=maxx)
printf("impossible\n");
else
printf("%d %d\n",k-maxx,index-mm);//实际上的根节点是减去m
printf("\n");
}
return 0;
}
hdu 2121无根最小树形图要建一个虚拟节点的更多相关文章
- HDU - 2121 Ice_cream’s world II 无根最小树形图
HDU - 2121 :http://acm.hdu.edu.cn/showproblem.php?pid=2121 比较好的朱刘算法blog:https://blog.csdn.net/txl199 ...
- hdu 2121 , hdu 4009 无定根最小树形图
hdu 2121 题目:给出m条有向路,根不确定,求一棵最小的有向生成树. 分析:增加一个虚拟节点,连向n个节点,费用为inf(至少比sigma(cost_edge)大).以该虚拟节点为根求一遍最小树 ...
- HDU ACM 2121 Ice_cream’s world II (无根最小树形图)
[解题思路]这题先看了NotOnlySuccess的解题思路,即设置虚根再处理的做法:弄了一个上午,再次有种赶脚的感觉~~如果需要找出为什么需要去比所有权值之和更大的数为新增的虚边的话,一开始我理解仅 ...
- hdu 2121 Ice_cream’s world II (无定根最小树形图)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2121 题目大意: 有n个点,有m条单向路,问这n个点组成最小树形图的最小花费. 解题思路: 1:构造 ...
- HDU 4009 Transfer water 最小树形图
分析:建一个远点,往每个点连建井的价值(单向边),其它输水线按照题意建单向边 然后以源点为根的权值最小的有向树就是答案,套最小树形图模板 #include <iostream> #incl ...
- HDU 4966 GGS-DDU(最小树形图)
n个技能,每个技能有0-a[i]的等级,m个课程,每个课程需要前置技能c[i]至少达到lv1[i]等级,效果是技能d[i]达到lv2[i]等级,花费w[i]. 输出最小花费使得全技能满级(初始全技能0 ...
- HDU 3820 Golden Eggs( 最小割 奇特建图)经典
Golden Eggs Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- hdu 2121
朱刘算法求无根最小树形图 可以任意选一个根,求最小的权和以及当时的根. 先建一个超级根,它连向所有点,边权为所有边的边权和加1(即sumw+1),然后求以它为根的最小树形图,再根据树形图权和与2*(s ...
- HDU 2121 Ice_cream’s world II 不定根最小树形图
题目链接: 题目 Ice_cream's world II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
随机推荐
- visual studio2013 C++查看对象布局
一在visual studio中进行设置,可以方便的查看对象的内存布局 右键所要显示的*.cpp >> 属性 >> 命令行 >> 其它选项 在其他选项中添加: /d ...
- oc49--@class
// Person.h #import <Foundation/Foundation.h> @class Car; //#import "Car.h" // 由于imp ...
- Android入门之文件系统操作(二)文件操作相关指令
(一)获取总根 File[] fileList=File.listRoots(); //返回fileList.length为1 //fileList.getAbsolutePath()为"/ ...
- poj2342 Anniversary party (树形dp)
poj2342 Anniversary party (树形dp) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9128 ...
- CNN tensorflow text classification CNN文本分类的例子
from:http://deeplearning.lipingyang.org/tensorflow-examples-text/ TensorFlow examples (text-based) T ...
- git的使用(转)
git 配置文件 git的配置文件位置针对所有用户:/etc/gitconfig针对当前用户: -/.gitconfig 查看配置的方法 git config --list 修改配置的方法 git c ...
- vs2010永久删除项目的相关操作
1.选中要删除的项目,在解决方案资源管理器中,直接左键点击一下即可.. 2.点击键盘的删除键“DElect”. 3.然后找到工程的目录后,删除项目.即可永久性删除不在需要的程序或者是项目.
- PCB MongoDB 数据库 Collection集合导出与导入
由于一直以来用微软可视化图形界面习惯了,而MongoDB是命令式操作,而用系统自带CMD操作不方便, 这里介绍一款CMD的替代品,大小100多M. Cmder工具下载 https://github. ...
- E20170905-mk
recursive adj. 回归的,递归的;
- javascript 原型(prototype 、__proto__、函数、对象)
一.类型 1.JavaScript中分为值类型(string/boolean/null/number/undefind).引用类型(数组.对象.函数): 2.数组.函数.对象都是对象: 对象是由函数创 ...