题意:

  给n个点编号为0~n-1,0号点为根,给m条边(含自环,重边),每条边有个代价,也有带宽。给定c,问代价不超过c,树形图的最小带宽的最大值能达到多少?

思路:

  点数才60,而带宽范围也不大,可以进行二分穷举最小带宽,将小于穷举值的边“禁用”,进行求树形图!只要能求得树形图,说明带宽还能继续往上提。

  注:如果只有根,即n=1,那么输出其中最小的一条边的带宽。而求树形图比较简单,用朱刘算法O(n*m),网上有模板。

  朱刘算法的精髓在于:缩点就缩得彻底,将原来的图都给改掉了。如果产生了环,那就缩点,缩点后,属于原来环上的边u-v就会变成一条自环(没用的)。而找环的技术也经典,只是复杂度看起来不止O(n)了,随着环越来越少,复杂度越高。

  

 #include <bits/stdc++.h>
#define INF 0x7f7f7f7f
#define pii pair<int,int>
#define LL long long
using namespace std;
const int M=;
const int N=; struct node
{
int from,to;
int bps,cost;
node(){};
node(int from,int to,int bps,int cost):from(from),to(to),bps(bps),cost(cost){};
}edge[M], cpy[M];
int edge_cnt, n, m, c; void add_node(int from,int to,int bps,int cost)
{
edge[edge_cnt]=node(from, to, bps, cost);
cpy[edge_cnt]=node(from, to, bps, cost);//拷贝
edge_cnt++;
} int far[N], In[N], ID[N], vis[N]; bool MST(int bps,int cost,int n,int root)
{
LL ans=;
while(true)
{
//找最小边
for(int i=; i<n; i++) In[i]=INF;
for(int i=; i<edge_cnt; i++)
{
int u=edge[i].from;
int v=edge[i].to;
if(edge[i].cost<In[v] && u!=v && edge[i].bps>=bps)
{
far[v]=u;
In[v]=edge[i].cost;
}
} //判断是否与生成树
for(int i=; i<n; i++)
{
if(i==root) continue;
if(In[i]==INF) return false; //缩点后root可能不为0
} //找环
int cntnode=;
memset(ID, -, sizeof(ID)); //ID保存的是环的编号
memset(vis, -, sizeof(vis));
In[root]=;
for(int i=; i<n; i++)
{
ans+=In[i];
int v=i;
while( vis[v]!=i && ID[v]==- && v!=root ) //用vis记录本次寻根所走过的点
{
vis[v]=i;
v=far[v];
}
if(ID[v]==- && v!=root)
{
for(int u=far[v]; u!=v; u=far[u])
{
ID[u]=cntnode;
}
ID[v]=cntnode++;
}
} if(cntnode==) break; for(int i=;i<n;i++) //不成环的点,单独作为1个环
if(ID[i]==-) ID[i]=cntnode++; //有环
for(int i=; i<edge_cnt; i++)
{
int v=edge[i].to;
edge[i].from =ID[edge[i].from]; //真的缩点,只不过边数仍然一样多
edge[i].to =ID[edge[i].to];
if(edge[i].from!=edge[i].to)
{
edge[i].cost-=In[v]; //如果u和v不是同个环,那么v的入边的大小得改了。
}
}
n=cntnode;
root=ID[root];
}
if(ans<=cost) return true;
else return false;
} int cal(int L,int R,int root)
{
while(L<R) //二分答案
{
for(int i=; i<edge_cnt; i++) edge[i]=cpy[i]; //注意要复制,因为原来的已经改变了 int mid=L+(R-L+)/;
if( MST(mid, c, n, root) ) L=mid;
else R=mid-;
}
return L;
} int main()
{
//freopen("input.txt", "r", stdin);
int t, u, v, a, b;
cin>>t;
while(t--)
{
scanf("%d%d%d", &n, &m, &c);
edge_cnt=;
int down=INF, up=; //找最大和最小进行二分 for(int i=; i<m; i++)
{
scanf("%d%d%d%d", &u, &v, &a, &b);
down=min(down, a);
up=max(up, a);
add_node(u, v, a, b);
} if(!MST(down, c, n, )) printf("streaming not possible.\n");
else printf("%d kbps\n", cal(down, up, )); //只有根的情况,输出down
}
return ;
}

AC代码

UVA 11865 Stream My Contest 组网 (朱刘算法,有向生成树,树形图)的更多相关文章

  1. UVA-11865 Stream My Contest (朱-刘 算法+二分)

    题目大意:有一张n个顶点,m条边的有向图,根节点为0.每条边有两个权值,一个是费用c,一个是长度b.问在总费用不超过cost的情况下选出若干条边,使得n个点连通时的边的最短长度的最大值是多少. 题目分 ...

  2. 【朱-刘算法】【最小树形图】hdu6141 I am your Father!

    题意:给你一张带权有向图,让你求最大树形图.并在此前提下令n号结点父亲的编号最小. 比赛的时候套了个二分,TLE了. 实际上可以给每个边的权值乘1000,对于n号结点的父边,加上(999-父结点编号) ...

  3. HDUOJ--2121--Ice_cream’s world II【朱刘算法】不定根最小树形图

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=2121 题意:n个顶点,m条边,求从某一点起建立有向图最小生成树而且花费最小.输出最小花费和根节点下标. ...

  4. UVA 11865 Stream My Contest(最小树形图)

    题意:N台机器,M条有向边,总资金C,现要到搭建一个以0号机(服务器)为跟的网路,已知每条网线可以把数据从u传递到v,其带宽为d,花费为c,且d越大,传输速度越快,问能够搭建的传输速度最快的网络d值是 ...

  5. UVA 11865 Stream My Contest (二分+最小树形图)

    题意:给定一个网络,一个服务器,其他的是客户机,有 m 条连线,每条有一个带宽和花费(单向边),让你用不超过 c 的花费,使得 0 到 所有的机器都能到达,并且使得最小带宽最大. 析:很明显是二分题, ...

  6. uvalive 11865 Stream My Contest

    题意: 有一个网络中心,和许多个城市,网络中心以及城市之间有若干条边,这些边有两个属性,最大带宽和修建费用. 现在要用最多不超过C的费用修建网络,使得每个城市都有网络连接,最大化最小带宽. 带宽限制是 ...

  7. 训练指南 UVA- 11865(有向最小生成树 + 朱刘算法 + 二分)

    layout: post title: 训练指南 UVA- 11865(有向最小生成树 + 朱刘算法 + 二分) author: "luowentaoaa" catalog: tr ...

  8. hdu2121 - Ice_cream’s world II(朱刘算法,不固定根)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2121 题目意思大概是要你在一些城市中选一个做首都 , 要求首都都能到其他城市 , 道路花费要最少 , ...

  9. UVa11183 Teen Girl Squad, 最小树形图,朱刘算法

    Teen Girl Squad  Input: Standard Input Output: Standard Output You are part of a group of n teenage ...

随机推荐

  1. 改写Form的submit

    表单的一些应用常识: 1.在用户第一次提交完表单后应防止用户不耐烦而多次点击submit按钮,需要在onsubmit事件中制止用户的重复行为. 2.不要简单粗暴的用reset()重置表单,如果用户不想 ...

  2. Content Providers详解

    今天仔细阅读了一遍Content Providers的官方API文档,总结了一下Android中Content Providers的用法. 各种类型的Content Provider对一个结构化的数据 ...

  3. C#的控制台程序输出

    1. int nChar; string mystring; Console.WriteLine("{0} {1}",nChar,mystring); 其中{0},{1}为占位符 ...

  4. JavaScript的基础语法,你真的了解吗?

    这篇文章是在我们熟悉了JS的基础语法后,很少有人去关注的一些细节部分.如果掌握了某些细节也许会对代码的改善有着非凡的作用.也许会使我们的代码更严谨,更高效. 1.if语句的条件 if条件中,括号里是布 ...

  5. Spring框架学习之第3节

    model层(业务层+dao层+持久层) spring开发提倡接口编程,配合di技术可以更好的达到层与层之间的解耦 举例: 现在我们体验一下spring的di配合接口编程,完成一个字母大小写转换的案例 ...

  6. 【ArcEngine入门与提高】Element(元素)、Annotation(注记)旋转

    因项目需要,需要做一个旋转注记的工具.因为注记这玩意用的比较少,网上资源也很少,所以做起来相当头疼.在经过一番研究之后,终于搞清楚注记的存储原理了,原来是和Element的类似,只不过注记是要把Ele ...

  7. Linux下Websphere无法关闭

    Websphere 启动关闭命令  linux 下首先查看进程 ./stopServcer.sh server1如果停不掉websphere服务.则强制杀掉其进程! 1.查看websphere进程号b ...

  8. HttpClient使用详解(转)

     HttpClient使用详解 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户 ...

  9. android 设置控件的颜色,字体

    1.用代码设置控件的颜色:    int b =  getResources().getColor(R.drawable.blue);//得到配置文件里的颜色    mButton.setTextCo ...

  10. [原]poj-3009-Curling 2.0-dfs

    题目太长就不贴了,题意: 上下左右四联通块,2表示起点,3表示终点,1为block,0为空地,每动一次冰壶,冰壶就会向推动的方向一直移动,直到碰到block或出界,如果碰到block就在block前停 ...