最小树形图模板 UVA11183
题意:给定n个节点m条边的有向带权图,求以0为根节点的最小树形图权值大小
用这个代码的时候要注意,这里的数据是从0开始的,边也是从0开始算,
所以在打主代码的时候,如果是从1开始,那么算法里面的从0开始的位置也要相应修改。
特别是下面的 node_circle;
#include<cstdio>
#include<algorithm>
#include<string.h>
using namespace std;
const int maxn=1e3+;
const int maxm=4e4+;
const int inf=0x3f3f3f3f;
int n,m;
int cost[maxn],pre[maxn],vis[maxn],id[maxn];
struct node
{
int u,v,w;
}a[maxm];
int zhu_liu(int root)
{
int ans=;
while(){
for(int i=;i<n;i++) cost[i]=inf; for(int i=;i<m;i++){
int u=a[i].u,v=a[i].v,w=a[i].w;
if(cost[v]>w&&u!=v){
pre[v]=u;
cost[v]=w;
}
} for(int i=;i<n;i++){
if(i==root) continue;
if(cost[i]==inf) return -;
} int cnt_circle=;
memset(id,-,sizeof(id));
memset(vis,-,sizeof(vis));
cost[root]=;
for(int i=;i<n;i++){
ans+=cost[i];
int p=i;
while(vis[p]!=i&&id[p]==-&&p!=root)
vis[p]=i,p=pre[p];
if(id[p]==-&&p!=root){
for(int u=pre[p];u!=p;u=pre[u]){
id[u]=cnt_circle;
}
id[p]=cnt_circle++;
}
}
if(!cnt_circle) break;
for(int i=;i<n;i++)
if(id[i]==-) id[i]=cnt_circle++;
for(int i=;i<m;i++){
int v=a[i].v;
a[i].u=id[a[i].u];
a[i].v=id[a[i].v];
if(a[i].u!=a[i].v){
a[i].w=a[i].w-cost[v];
}
}
n=cnt_circle;
root=id[root];
}
return ans;
}
int main()
{
int T;
int cnt=;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i=;i<m;i++)
scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);
int ans=zhu_liu();
printf("Case #%d: ",++cnt);
if(ans==-) printf("Possums!\n");
else printf("%d\n",ans);
}
return ;
}
给出从1开始的代码;
这道题是以r为根,点是从1~n,
#include<cstdio>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
const int maxn=1e4+;
const ll inf=0x3f3f3f3f3f3f3f;
struct node
{
ll u,v,w;
}a[maxn];
ll n,m; //点的个数和边的个数都要定在全局变量,因为zhuliu里用到;
ll cost[maxn],pre[maxn],vis[maxn],id[maxn];
ll zhu_liu(ll root)
{
ll ans=;
while(){
for(ll i=;i<=n;i++) cost[i]=inf; for(ll i=;i<=m;i++){
ll u=a[i].u,v=a[i].v,w=a[i].w;
if(cost[v]>w&&u!=v){
pre[v]=u;
cost[v]=w;
}
} for(ll i=;i<=n;i++){
if(i==root) continue;
if(cost[i]==inf) return -; //无法构成就输出-1;
} ll cnt_circle=;
memset(id,-,sizeof(id));
memset(vis,-,sizeof(vis));
cost[root]=;
for(ll i=;i<=n;i++){
ans+=cost[i];
ll p=i;
while(vis[p]!=i&&id[p]==-&&p!=root)
vis[p]=i,p=pre[p];
if(id[p]==-&&p!=root){
for(ll u=pre[p];u!=p;u=pre[u]){
id[u]=cnt_circle;
}
id[p]=cnt_circle++;
}
}
if(cnt_circle==) break;
for(ll i=;i<=n;i++)
if(id[i]==-) id[i]=cnt_circle++;
for(ll i=;i<=m;i++){
ll v=a[i].v;
a[i].u=id[a[i].u];
a[i].v=id[a[i].v];
if(a[i].u!=a[i].v){
a[i].w=a[i].w-cost[v];
}
}
n=cnt_circle-;
root=id[root];
}
return ans;
}
int main()
{
ll r;
while(scanf("%lld%lld%lld",&n,&m,&r)!=EOF){
for(ll i=;i<=m;i++){
scanf("%lld%lld%lld",&a[i].u,&a[i].v,&a[i].w);
}
ll ans=zhu_liu(r);
printf("%lld\n",ans);
}
return ;
}
最小树形图模板 UVA11183的更多相关文章
- HDU 2121 Ice_cream’s world II 最小树形图 模板
开始学习最小树形图,模板题. Ice_cream’s world II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32 ...
- POJ 3164 Command Network 最小树形图模板
最小树形图求的是有向图的最小生成树,跟无向图求最小生成树有很大的区别. 步骤大致如下: 1.求除了根节点以外每个节点的最小入边,记录前驱 2.判断除了根节点,是否每个节点都有入边,如果存在没有入边的点 ...
- POJ 3164 Command Network(最小树形图模板题+详解)
http://poj.org/problem?id=3164 题意: 求最小树形图. 思路: 套模板. 引用一下来自大神博客的讲解:http://www.cnblogs.com/acjiumeng/p ...
- poj 3164(最小树形图模板)
题目链接:http://poj.org/problem?id=3164 详细可以看这里:http://www.cnblogs.com/vongang/archive/2012/07/18/259685 ...
- poj 3164 最小树形图模板!!!
/* tle十几次,最后发现当i从1开始时,给环赋值时要注意啊! 最小树形图 */ #include<stdio.h> #include<string.h> #include& ...
- poj3164最小树形图模板题
题目大意:给定一个有向图,根节点已知,求该有向图的最小树形图.最小树形图即有向图的最小生成树,定义为:选择一些边,使得根节点能够到达图中所有的节点,并使得选出的边的边权和最小. 题目算法:朱-刘算法( ...
- hdu 4009 最小树形图模板题朱刘算法
#include<stdio.h> /*思路:显然对于每个地方, 只有一种供水方式就足够了,这样也能保证花费最小, 而每个地方都可以自己挖井,所以是不可能出现无解的情况的, 为了方便思考, ...
- uva11183 最小树形图模板题
很简单的模板题,不多说了 #include<iostream> #include<cstring> #include<cstdio> #define INF 0x3 ...
- poj 3164 Command Network(最小树形图模板)
Command Network http://poj.org/problem?id=3164 Time Limit: 1000MS Memory Limit: 131072K Total Subm ...
随机推荐
- python中的strip()方法
python中字符串str的strip()方法 str.strip()就是把字符串(str)的头和尾的空格,以及位于头尾的\n \t之类给删掉. 例1: str=" python " ...
- pl/sql快速输入select * from等语句快捷键设置
1.工具-->首选项 2.编辑器-->编辑 3.定义快捷键 -- > 保存 4.快捷键+回车就可以出现
- Verilog-格雷码加法器
1.概述 格雷码执行加1操作最多只会变1位,可用在多位地址指针中消除毛刺. 2.verilog代码 `timescale 1ns / 1ps module gray_adder #() ( input ...
- springBoot 发送邮件图片不显示
解决方案 MimeMessageHelper 的执行顺序错了,先执行 setText() 然后执行 addInline() 添加图片 <img src="cid:p03"/& ...
- 网页出现横向滚动条的原因可能是使用bootstrap不当引起
Bootstrap的栅格布局超级方便我们写网页.但是在不是全体配合使用的情况下,会出现横向滚动条的现象. 什么叫不是配合使用的情况呢? >>一种情况是:你使用了row作为你的第一层父元素: ...
- c++踩坑大法好 数组
1,c++遍历数组 int数组和char数组不同哦,int占4位,char占1未,同理double也不同.基本遍历方法: ] = { ,,, }; ]); printf("len of my ...
- 1.spring异常:Caused by: java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springfr ...
- 一些docker资料汇总
安装vmtools https://blog.csdn.net/qq_37764098/article/details/95538813 挂载vm共享文件夹 https://www.cnblogs.c ...
- OpenTLD相关资料
这是一位来自奥地利的博士生的博客 他的介绍如下: I am a PhD student at the Safety and Security Department of the Austrian In ...
- 一次 utf-8 bom引起的问题
同事代码新增加了功能,推到服务器上,意外导致登录失败,回退到之前的版本上,可以正常使用. 这次只上传了 route.php 文件,系统登录失败. 随后使用kdiff3对比了两版本的route.php文 ...