最小树形图模板 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 ...
随机推荐
- 合唱队形【dp】
链接:https://ac.nowcoder.com/acm/contest/1082/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言2621 ...
- [P3935] Calculating - 整除分块
容易发现题目要求的 \(f(x)\) 就是 \(x\) 的不同因子个数 现在考虑如何求 \(\sum_{i=1}^n f(i)\),可以考虑去算每个数作为因子出现了多少次,很容易发现是 \([n/i] ...
- "换行"和"回车"的来历
\r: return 到当前行的最左边. \n: newline 向下移动一行,并不移动左右. Linux中\n表示:回车+换行: Windows中\r\n表示:回车+换行. Mac中\r表示:回车+ ...
- Mabitis中的#与$符号区别及用法介绍
这篇文章主要介绍了Mabitis中的 #{}与 ${} 符号区别,需要的朋友可以参考下 一.介绍 mybatis 中使用 Mapper.xml里面的配置进行 sql 查询,经常需要动态传递参数,例 ...
- python 音频可视化
代码整理好放在 github 上了: https://github.com/darkchii/visualize bilibili 演示视频:https://www.bilibili.com/vide ...
- RabbitMQ使用注意事项
用ConnectionFactory创建的TCP连接要复用,因为创建新的TCP连接比较耗时. IModel(信道)是轻量级的,可以用时创建. channel.BasicQos(0, 1, false) ...
- javascript当中的构造函数的用法
5)构造函数的用法: 例 3.5.1 <head> <meta http-equiv="content-type" content="text/h ...
- 插件与App的跳转,及路由的关系
在SDK中 无法直接跳App 的界面,这个时候需要使用 路由,或者通过 NSClassFromString 的 presentViewController 来跳转. 直接贴代码: UIViewCont ...
- [UOJ228] 基础数据结构练习题 - 线段树
考虑到一个数开根号 \(loglog\) 次后就会变成1,设某个Node的势能为 \(loglog(maxv-minv)\) ,那么一次根号操作会使得势能下降 \(1\) ,一次加操作最多增加 \(l ...
- pygame 浅解
import pygame from first_pygame.plane_spirit import * # 调用重载的精灵类 # 初始化 pygame.init() # 初始化所有所需游戏模块 s ...