Internship-ZOJ2532(网络流求割边)
Internship
Time Limit: 5 Seconds
Memory Limit: 32768 KB
CIA headquarter collects data from across the country through its classified network. They have been usingoptical fibres long before it's been deployed on any civilian projects. However they are still under a lotpressure recently because the data are growing
rapidly. As a result they are considering upgrading thenetwork with new technologies that provide a few times wider bandwidth. In the experiemental stage,they would like to upgrade one segment of their original network in order to see how it performs. Andas
a CIA intern it's your responsibility to investigate which segment could actually help increasethe total bandwidth the headquarter receives, suppose that all the cities have infinite data to sendand the routing algorithm is optimized. As they have prepared
the data for you in a few minutes, you aretold that they need the result immediately. Well, practically immediately.
Input
Input contains multiple test cases. First line of each test case contains three integers n, m and l, theyrepresent the number of cities, the number of relay stations and the number of segments. Cities will bereferred to as integers from 1 to n, while relay
stations use integers from n+1 to n+m. You can savesassume that n + m <= 100, l <= 1000 (all of them are positive). The headquarter is identified by theinteger 0.
The next l lines hold a segment on each line in the form of a b c, where a is the source node and b isthe target node, while c is its bandwidth. They are all integers where a and b are valid identifiers(from 0 to n+m). c is positive. For some reason the
data links are all directional.
The input is terminated by a test case with n = 0. You can safely assume that your calculation canbe housed within 32-bit integers.
Output
For each test print the segment id's that meets the criteria. The result is printed in a single lineand sorted in ascending order, with a single space as the separator. If none of the segment meets thecriteria, just print an empty line. The segment id is
1 based not 0 based.
Sample Input
2 1 3
1 3 2
3 0 1
2 0 1
2 1 3
1 3 1
2 3 1
3 0 2
0 0 0
Sample Output
2 3
<hey here is an invisible empty line>
Author: WU, Jiazhi
Source: CYJJ's Funny Contest #3, Having Fun in Summer
题意:CIA公司想采用新技术升级网络,在实验测试阶段,他们想升级其中的一段网络以便观察新技术在多大的长度上提升网络的性能,你作为实习生的任务是调查那一段网络能提高CIA总部的宽带。
思路:判断一段网络可不可以提升网络就要看它是不是满流,如果满流则可能在升级后提升CIA总部的宽带,但是如果提升后并不能增广,即不能提升CIA总部的宽带,所以判断一段是不是可提升的则有两个条件:(1)在进行增广后这段网络是满流的,(2)在提升后可以增广。
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <algorithm> using namespace std; const int INF = 0x3f3f3f3f; typedef struct node
{ int u; int v; int Flow; int next;
}Line; Line Li[2200]; int Head[110],top; int vis[110],ans[110]; bool vis1[110],vis2[110]; int n,m,l; int s,t; void AddEdge(int u,int v,int f)
{
Li[top].v=v; Li[top].u=u;
Li[top].Flow=f;
Li[top].next=Head[u];
Head[u]=top++;
} bool BFS()
{
memset(vis,-1,sizeof(vis)); vis[s]=0; queue<int >Q; Q.push(s); while(!Q.empty())
{ int u=Q.front(); Q.pop(); for(int i=Head[u];i!=-1;i=Li[i].next)
{ if(Li[i].Flow&&vis[Li[i].v]==-1)
{
vis[Li[i].v]=vis[u]+1; Q.push(Li[i].v); }
}
}
return vis[t]!=-1; } int DFS(int u,int f)
{
if(u==t)
{
return f;
}
int ans=0; for(int i=Head[u];i!=-1;i=Li[i].next)
{
if(Li[i].Flow&&vis[Li[i].v]==vis[u]+1)
{
int d=DFS(Li[i].v,min(f,Li[i].Flow));
f-=d;
Li[i].Flow-=d;
Li[i^1].Flow+=d;
ans+=d;
}
}
return ans;
} void dfs(int u,bool *vist,int op)
{
vist[u]=true; for(int i=Head[u];i!=-1;i=Li[i].next)
{
if(!vist[Li[i].v]&&Li[i^op].Flow!=0)
{
dfs(Li[i].v,vist,op);
}
}
} void Dinic()//网络流进行增广
{
int ans; while(BFS())
{
ans=DFS(s,INF); }
} int main()
{
while(~scanf("%d %d %d",&n,&m,&l))
{ if(n+m+l==0)
{
break;
} s=n+m+1;//源点 t=0;//汇点 memset(Head,-1,sizeof(Head)); int a,b,c; top = 0; for(int i=0;i<l;i++)
{
scanf("%d %d %d",&a,&b,&c);
AddEdge(a,b,c);//建立边,正向为c,负向为0
AddEdge(b,a,0);
} for(int i=1;i<=n;i++)
{
AddEdge(s,i,INF); AddEdge(i,s,0);//建立城市与源点之间的边,权值为INF
} Dinic(); memset(vis1,false,sizeof(vis1)); memset(vis2,false,sizeof(vis2)); dfs(s,vis1,0);//从源点向汇点搜索,标记还有剩余流的点 dfs(t,vis2,1);//从汇点到源点搜索,标记还有剩余流的点 int num=0; for(int i=0;i<l;i++)
{
if(Li[i<<1].Flow==0&&vis1[Li[i<<1].u]&&vis2[Li[i<<1].v])
{
ans[num++]=i+1;//如果一条边的u与v都被标记,表明s->u,v->t,但是这条边是满流,所以提升这条边。
}
} if(num)
{
for(int i=0;i<num;i++)
{
if(i)
{
printf(" ");
}
printf("%d",ans[i]);
}
}
printf("\n"); }
return 0;
}
Internship-ZOJ2532(网络流求割边)的更多相关文章
- B - Internship (网络流关键割边)
题目链接:https://cn.vjudge.net/contest/281961#problem/B 题目大意:给你n个城市,中间有一些中转站,然后给你终点,再给你l条轨道以及流量,问你增加哪几条轨 ...
- [学习笔记]tarjan求割边
上午打模拟赛的时候想出了第三题题解,可是我不会求割边只能暴力判割边了QAQ 所以,本文介绍求割边(又称桥). 的定义同求有向图强连通分量. 枚举当前点的所有邻接点: 1.如果某个邻接点未被访问过,则访 ...
- 【NOIP训练】【Tarjan求割边】上学
题目描述 给你一张图,询问当删去某一条边时,起点到终点最短路是否改变. 输入格式 第一行输入两个正整数,分别表示点数和边数.第二行输入两个正整数,起点标号为,终点标号为.接下来行,每行三个整数,表示有 ...
- ZOJ 2588 Burning Bridges (tarjan求割边)
题目链接 题意 : N个点M条边,允许有重边,让你求出割边的数目以及每条割边的编号(编号是输入顺序从1到M). 思路 :tarjan求割边,对于除重边以为中生成树的边(u,v),若满足dfn[u] & ...
- ZOJ Problem - 2588 Burning Bridges tarjan算法求割边
题意:求无向图的割边. 思路:tarjan算法求割边,访问到一个点,如果这个点的low值比它的dfn值大,它就是割边,直接ans++(之所以可以直接ans++,是因为他与割点不同,每条边只访问了一遍) ...
- HDU 4738——Caocao's Bridges——————【求割边/桥的最小权值】
Caocao's Bridges Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- POJ3694(求割边)
Network Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7943 Accepted: 2893 Descripti ...
- tarjan求割边割点
tarjan求割边割点 内容及代码来自http://m.blog.csdn.net/article/details?id=51984469 割边:在连通图中,删除了连通图的某条边后,图不再连通.这样的 ...
- ZOJ 2588 求割边问题
题目链接:http://vjudge.net/problem/viewProblem.action?id=14877 题目大意: 要尽可能多的烧毁桥,另外还要保证图的连通性,问哪些桥是绝对不能烧毁的 ...
随机推荐
- ZK tree使用mold
前台Tree.zul <?page title="Tree使用" contentType="text/html;charset=UTF-8"?> & ...
- centos6 搭建ELK
mark一下时间:2016年2月19日10:17:09 记录使用 Logstash: Logstash服务的组件,用于处理传入的日志. Elasticsearch: 存储所有日志 Kibana 4: ...
- BizTalk开发系列(十九) BizTalk命名规范
目前BizTalk项目的开发人员比较少,但是在开发过程中还是需要命名规范的约束.根据以往BizTalk项目的经验,整理了BizTalk命 名规范.包括:BizTalk Application, Sch ...
- Java封装
面向对象的三大特征:封装.继承.多态.封装在书面上来说,他无非就是set和get方法罢了.为什么要用到封装,比如买主机如果没有机箱只有内存条.CPU.主板等等那些零件买回到家,你还得一个个的去装那些零 ...
- 14交互活动:XHTML表单
表单基本上就是带有一块输入信息区域的网页.当提交表单时,表单中的信息被打成一个数据包发送给web服务器,web应用程序对之经行处理.处理完成后,可以获得另一个相应页面. 使用<form>元 ...
- Java 实现MapReduce函数
明白了MapReduce程序的工作原理之后,下一步就是写代码来实现它.我们需要三样东西:一个map函数.一个reduce函数和一些用来运行作业的代码.map函数由Mapper类来表示,后者声明一个ma ...
- windows服务的创建、安装、调试全过程及引发的后续学习
前几天做项目的时候需要用到window服务,研究一段时间,算是掌握了最基本的使用方法吧,现总结如下: 引言:在项目过程中碰到一个问题:需要不断的扫描一个大型数据库表,并获取dataset,以便做后续的 ...
- 关于iOS去除数组中重复数据的几种方法
关于iOS去除数组中重复数据的几种方法 在工作工程中我们不必要会遇到,在数组中有重复数据的时候,如何去除重复的数据呢? 第一种:利用NSDictionary的AllKeys(AllValues)方 ...
- SQLite的使用--SQLite语句
一.SQLite的介绍 1.为什么要存储数据? 1.1 手机数据大多都是从网络加载的,不存储,每次滚动界面都要从新发送网络请求加载数据,浪费流量 1.2 当用户没网的时候, ...
- tomcat server需要重启的时刻
1.修改了web project的任何配置文件,都需要重启tomcat 2.修改了任何java class文件,都需要重启tomcat server 3.在项目中添加了任何的文件,包括配置文件.jav ...