最小树形图模板 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 ...
随机推荐
- The Number of Inversions(逆序数)
For a given sequence A={a0,a1,...an−1}A={a0,a1,...an−1}, the number of pairs (i,j)(i,j) where ai> ...
- 一道CTF针对XXE漏洞的练习
题目链接:http://web.jarvisoj.com:9882/ 目的很明确获取/home/ctf/flag.txt的内容 一般读取目标机的本地文件都会用到file协议. 思路: 那么思路一:文件 ...
- centos因为安装花生壳而无法登录系统的问题
服务器安装 phddns 花生壳 启动失败,一直卡在启动进度条页面. 解决办法 1.按F5查看卡在什么位置, 2.查看解决方法:程序卡住的情况下,直接备份资料后,卸载程序重启就可以了. 3.进入到si ...
- Codeforce 584A - Olesya and Rodion
Olesya loves numbers consisting of n digits, and Rodion only likes numbers that are divisible by t. ...
- ASP.NET MVC 简介(附VS2019和VSCode版示例)
MVC可以理解为一种思想,应用在web应用程序的架构上. ASP.NET MVC的核心类是实现了IHttpHandler接口的MVCHandler,它的底层仍然是HttpHandler.HttpReq ...
- [SHOI2001] 小狗散步 - 二分图匹配
考虑到每次与主人相遇之前最多只去一个景点,很容易转化为匹配问题 由于数据很小,我们不妨枚举每个相遇点间隙和每个景点,判断是否来得及,如果来得及就连边 沙雕题搞了二十来分钟,我是憨憨 #include ...
- nginx启动时指定配置文件
下载源文件方式安装nginx 会在/usr/local目录下安装nginx 此时虚拟机系统中会有两个nginx 如果启动的时候没有指定配置文件的位置,默认读取的配置文件就是/usr/local/ngi ...
- C++构造函数和重载函数运算符如何区分
构造函数和重载函数运算符如何区分: class Distance { private: int feet; int inches; public: Distance(){ feet = ; inche ...
- 题解【洛谷P5788】【模板】单调栈
题面 单调栈模板题. 单调栈与单调队列一样,都是维护了一段区间内的顺序. 然后--这个题用一个栈维护一下贪心就没了. 具体参考这一篇题解 #include <bits/stdc++.h> ...
- echarts 设置默认选中,单选
默认选中 和 不选中 传送门