题意:给定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的更多相关文章

  1. HDU 2121 Ice_cream’s world II 最小树形图 模板

    开始学习最小树形图,模板题. Ice_cream’s world II Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32 ...

  2. POJ 3164 Command Network 最小树形图模板

    最小树形图求的是有向图的最小生成树,跟无向图求最小生成树有很大的区别. 步骤大致如下: 1.求除了根节点以外每个节点的最小入边,记录前驱 2.判断除了根节点,是否每个节点都有入边,如果存在没有入边的点 ...

  3. POJ 3164 Command Network(最小树形图模板题+详解)

    http://poj.org/problem?id=3164 题意: 求最小树形图. 思路: 套模板. 引用一下来自大神博客的讲解:http://www.cnblogs.com/acjiumeng/p ...

  4. poj 3164(最小树形图模板)

    题目链接:http://poj.org/problem?id=3164 详细可以看这里:http://www.cnblogs.com/vongang/archive/2012/07/18/259685 ...

  5. poj 3164 最小树形图模板!!!

    /* tle十几次,最后发现当i从1开始时,给环赋值时要注意啊! 最小树形图 */ #include<stdio.h> #include<string.h> #include& ...

  6. poj3164最小树形图模板题

    题目大意:给定一个有向图,根节点已知,求该有向图的最小树形图.最小树形图即有向图的最小生成树,定义为:选择一些边,使得根节点能够到达图中所有的节点,并使得选出的边的边权和最小. 题目算法:朱-刘算法( ...

  7. hdu 4009 最小树形图模板题朱刘算法

    #include<stdio.h> /*思路:显然对于每个地方, 只有一种供水方式就足够了,这样也能保证花费最小, 而每个地方都可以自己挖井,所以是不可能出现无解的情况的, 为了方便思考, ...

  8. uva11183 最小树形图模板题

    很简单的模板题,不多说了 #include<iostream> #include<cstring> #include<cstdio> #define INF 0x3 ...

  9. poj 3164 Command Network(最小树形图模板)

    Command Network http://poj.org/problem?id=3164 Time Limit: 1000MS   Memory Limit: 131072K Total Subm ...

随机推荐

  1. 【巨杉数据库SequoiaDB】巨杉Tech | 四步走,快速诊断数据库集群状态

    1.背景 SequoiaDB 巨杉数据库是一款金融级分布式数据库,包括了分布式 NewSQL.分布式文件系统与对象存储.与高性能 NoSQL 三种存储模式,分别对应分布式在线交易.非结构化数据和内容管 ...

  2. 手动运行jar包,指定配置文件

    打包程序 mvn package cd target 指定参数运行 java -jar spring-boot-demo-0.0.1-SNAPSHOT.jar --spring.profile.act ...

  3. 二分-D - Can you solve this equation?

    D - Can you solve this equation? Now,given the equation 8*x^4 + 7*x^3 + 2*x^2 + 3*x + 6 == Y,can you ...

  4. 关于EasyUI DataGrid行编辑时嵌入时间控件

    本人做一个名为“安徽中控”项目时,为快速开发基础数据增删改模块,遂采用EasyUIDatagrid将所有增删改查的操作都集中于表格中,并且所有增删改查操作都集中于泛型对象,从而不必为每个表写具体的增删 ...

  5. Mysql部分存储引擎介绍

    Mysql存储引擎 什么是存储引擎 mysql中建立的库 --> 文件夹 库中建立的表 --> 文件 ​ 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制: ...

  6. scrapy爬虫保存数据

    1.数据保存为TXT 打开Pipeline.py import codecs import os import json import pymysql class CoolscrapyPipeline ...

  7. JUC—Callable接口

    一.callable接口是什么? 面试题: 获得多线程的方法几种? 正确答案如下: 传统的 是继承thread类和实现runnable接口, java5以后又有实现 callable接口 和 java ...

  8. 2020算法设计竞赛 C 汉诺塔

    作者:珩月链接:https://ac.nowcoder.com/discuss/367149来源:牛客网 将木板按照Xi从小到大排序,将这时的Yi数列记为Zi数列,则问题变成将Zi划分为尽可能少的若干 ...

  9. 环境配置 | mac环境变量文件.bash_profile相关

    每次环境配置都费老劲,零零碎碎的知识就记在这里 文件:~/.bash_profile

  10. A conflict in the working copy obstructs the current operation

    svn: Commit failed (details follow): svn: Aborting commit: 'G:\chengXu\2017_Year\Easy7视频结构化\UploadFi ...