Ice_cream’s world II

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6849    Accepted Submission(s): 1818

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2121

Description:

After awarded lands to ACMers, the queen want to choose a city be her capital. This is an important event in ice_cream world, and it also a very difficult problem, because the world have N cities and M roads, every road was directed. Wiskey is a chief engineer in ice_cream world. The queen asked Wiskey must find a suitable location to establish the capital, beautify the roads which let capital can visit each city and the project’s cost as less as better. If Wiskey can’t fulfill the queen’s require, he will be punishing.

Input:

Every case have two integers N and M (N<=1000, M<=10000), the cities numbered 0…N-1, following M lines, each line contain three integers S, T and C, meaning from S to T have a road will cost C.

Output:

If no location satisfy the queen’s require, you must be output “impossible”, otherwise, print the minimum cost in this project and suitable city’s number. May be exist many suitable cities, choose the minimum number city. After every case print one blank.

Sample Input:

3 1
0 1 14 4
0 1 10
0 2 10
1 3 20
2 3 30

Sample Output:

impossible40 0

题意:

给出一个有向图,然后让你选一个点作为起点,满足从这个点可以到达其它点,并且总权和最小。

题解:

这就是一个不固定根的有向图最小生成树问题。思路还是挺有趣的。

我们不可能对每个点都跑一遍朱刘算法,所以考虑加一个虚根,然后边权为INF,直接从这个虚根来跑就行了。最后答案就是跑出来的值减去INF。

但是这里要注意的是一些不合法的情况,就是最后的答案大于2*INF时,因为这时,说明至少有两个点入度为0,那么说明不可能存在一颗有向图的生成树。

至于这个INF怎么取,只要满足大于等于边权和就行了(我是这么想的),不知道为什么不能等于,这个问题我纠结了很久,就在刚才知道为什么了。。

可能存在只有一条边的情况,这时如果连边权和,这时算法可能会出错。

最后输出起点,这里比较巧妙,是根据边来的,因为我们会改变点(算法缩点),但边并没有改变,具体见代码:

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<cstring>
#define INF 1e17
using namespace std;
typedef long long ll;
int n,m,t;
const int N = 1010,M = 10005;
struct Edge{int u,v,w;
}e[M<<1];
int pre[N]; //记录前驱
int Rt;
ll id[N],vis[N],in[N];
ll dirMst(int root){ll ans=0;while(1){for(int i=0;i<=n;i++) in[i]=INF;memset(id,-1,sizeof(id));memset(vis,-1,sizeof(vis));for(int i=1;i<=m;i++){int u=e[i].u,v=e[i].v,w=e[i].w;if(w<in[v] && v!=u){pre[v]=u;in[v]=w;if(u==root) Rt=i;}}           //求最小入边集in[root]=0;pre[root]=root;for(int i=0;i<n;i++){if(in[i]==INF) return -1;ans+=in[i];}int idx = 0; //新标号for(int i=0;i<n;i++){if(vis[i] == -1 ){int u = i;while(vis[u] == -1){vis[u] = i;u = pre[u];}if(vis[u]!=i || u==root) continue;     //判断是否形成环for(int v=pre[u];v!=u;v=pre[v] )id[v]=idx;id[u] = idx++;}}if(idx==0) break;for(int i=0;i<n;i++){if(id[i]==-1) id[i]=idx++;}for(int i=1;i<=m;i++){e[i].w-=in[e[i].v];e[i].u=id[e[i].u];e[i].v=id[e[i].v];}n = idx;root = id[root];//给根新的标号
    }return ans;
}int main(){while(scanf("%d%d",&n,&m)!=EOF){ll sum = 0;for(int i=1;i<=m;i++){int u,v,w;scanf("%d%d%d",&u,&v,&w);e[i]=Edge{u,v,w};sum+=w;}sum++;for(int i=0;i<n;i++){e[i+m+1]=Edge{n,i,sum};}ll tmp=m;m+=n;n++;ll ans = dirMst(n-1);if(ans>2*sum) printf("impossible\n\n");else printf("%lld %lld\n\n",ans-sum,Rt-tmp-1ll);}
}

转载于:https://www.cnblogs.com/heyuhhh/p/10372510.html

HDU2121:Ice_cream’s world II (虚根+有向图最小生成树)相关推荐

  1. hdu2121 Ice_cream's world II

    hdu2121 Ice_cream's world II 给一个有向图,求最小树形图,并输出根节点 \(n\leq10^3,\ m\leq10^4\) 最小树形图 对于求无根最小树形图,可以建一个虚拟 ...

  2. HDU 2121 Ice_cream’s world II (最小树形图+虚根)

    题意:有n个点(0~n-1),m条有向边,问以哪个点作为起点使得最小生成树的权值最小,如果可以构成输出权值和顶点编号,否则输出impossible. 题解:最小树形图+虚根 还好做了这题,板子有点问题 ...

  3. HDU 2121 Ice_cream’s world II(最小树形图+虚根)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2121        题意是有n个点(0--n-1),m条有向边,问以那个点作为起点使得最小生成树的权值 ...

  4. HDU - 2121 Ice_cream’s world II(朱刘算法+虚根)

    题目大意:给你N个点,M条有向边,问以哪个点为根结点时,能使最小生成树总权值达到最小,输出总权值和根. 如果构不成最小生成树,另外输出 解题思路:这题很巧妙,暴力枚举的话,肯定TLE,所以,这题就需要 ...

  5. hdu 2121 Ice_cream’s world II

    无固定根节点的最小树形图,添加一个人工根节点,人工根节点到每个节点的权值sum>(所有边权值之和), 求出结果减去sum,只有人工根节点跟一个节点相连时才会有解,如果结果大于等于sum,则人工节 ...

  6. 【转】【最小树形图】有向图的最小生成树【朱刘算法】

    这篇文章挺好的.每行还有注释QAQ,kuangbin的模板里并没有万能节点: 万能节点好像是在不定根的时候的拓展. 要点: 1.求所有边权和sum; 2.以0点为万能节点向所有点建一条权值为sum的边 ...

  7. 最小树形图【有向图的最小生成树】

    做了POJ的一道题,总是WA,不知道为什么,后来去看了,才知道,原来有向图的最小生成树与无向图不一样,它得是从某个点出发能遍历到其他所有点的才行,以此为条件,我们学习到了最小树形图. 与很多其他人的讲 ...

  8. 2019.9.18最小生成树知识点总结

    HDU 4081 Qin Shi Huang's National Road System(次小生成树-Kruskal) 博主的方法很好,但是有疑问,为什么不能将最多人口的两城市的距离设置为0,在进行 ...

  9. 【HDOJ图论题集】【转】

    1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...

最新文章

  1. 核弹级漏洞log4shell席卷全球!危及苹果腾讯百度网易,修改iPhone名称就可触发...
  2. 实践作业4:Web测试实践(小组作业)每日任务记录3
  3. 【Curl】 获取网站下载速率(Bytes/s)
  4. apache配置多个站点
  5. C#中的套接字编程(二) --转
  6. mysql报错注入实战_手工注入——MySQL手工注入实战和分析
  7. 设置android 触摸灵敏,3D Press触屏灵敏度设置教程 魅族PRO 6 3D Press触控力度怎么调...
  8. python set去重 字典 计算求和_python字典set方法的特殊方法
  9. 匈牙利命名法、骆驼命名法、帕斯卡(pascal)命名法 C#命名规范
  10. FL Studio20.8中文完整版本覆盖升级更新说明介绍v20.8.3
  11. 【OpenCV】分离多通道图像RGB的值
  12. Download and Install R and RStudio for win10
  13. 利用linux内核代码玩转c链表
  14. 中国价格统计年鉴(2013-2021年)
  15. 条形码、二维码、三维码解读
  16. 怎么理解本征无序态的蛋白质(Intrinsically disordered proteins)
  17. 制作半透明的毛玻璃效果教程
  18. 威联通 nas mysql_威联通(NAS)应用篇:自建OwnCloud网盘(百度网盘,拜拜~~~)
  19. mtk插u盘如何休眠?_iOS13.3.1 U盘越狱卡代码问题,你也是吗?
  20. DeepMind爆发史:决定AI高峰的“游戏玩家”|深度学习崛起十年

热门文章

  1. HDU 1114 Piggy-Bank 猪仔储钱罐(完全背包)
  2. 黑客的成长(学会使用武器)
  3. p2p网络测试工具_(官方更新)IPFS的网络层——libp2p在2020的发展
  4. MyBatis为什么这么“屌”?这些MyBatis的秘密,分分钟吊打面试官
  5. dp主机_怎样设置显示器DP接口信号优先?
  6. “集五福”瓜分20亿!互联网巨头扎堆春节红包大战,暗藏啥玄机?
  7. 杨氏不等式(控制中的应用)
  8. MySQL的一级索引和二级索引
  9. 全球及中国雾化铜和铜合金粉末行业产销需求及发展动态分析报告2022-2028年
  10. vue3 ref函数用法