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(网络流求割边)的更多相关文章

  1. B - Internship (网络流关键割边)

    题目链接:https://cn.vjudge.net/contest/281961#problem/B 题目大意:给你n个城市,中间有一些中转站,然后给你终点,再给你l条轨道以及流量,问你增加哪几条轨 ...

  2. [学习笔记]tarjan求割边

    上午打模拟赛的时候想出了第三题题解,可是我不会求割边只能暴力判割边了QAQ 所以,本文介绍求割边(又称桥). 的定义同求有向图强连通分量. 枚举当前点的所有邻接点: 1.如果某个邻接点未被访问过,则访 ...

  3. 【NOIP训练】【Tarjan求割边】上学

    题目描述 给你一张图,询问当删去某一条边时,起点到终点最短路是否改变. 输入格式 第一行输入两个正整数,分别表示点数和边数.第二行输入两个正整数,起点标号为,终点标号为.接下来行,每行三个整数,表示有 ...

  4. ZOJ 2588 Burning Bridges (tarjan求割边)

    题目链接 题意 : N个点M条边,允许有重边,让你求出割边的数目以及每条割边的编号(编号是输入顺序从1到M). 思路 :tarjan求割边,对于除重边以为中生成树的边(u,v),若满足dfn[u] & ...

  5. ZOJ Problem - 2588 Burning Bridges tarjan算法求割边

    题意:求无向图的割边. 思路:tarjan算法求割边,访问到一个点,如果这个点的low值比它的dfn值大,它就是割边,直接ans++(之所以可以直接ans++,是因为他与割点不同,每条边只访问了一遍) ...

  6. HDU 4738——Caocao's Bridges——————【求割边/桥的最小权值】

     Caocao's Bridges Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  7. POJ3694(求割边)

    Network Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 7943   Accepted: 2893 Descripti ...

  8. tarjan求割边割点

    tarjan求割边割点 内容及代码来自http://m.blog.csdn.net/article/details?id=51984469 割边:在连通图中,删除了连通图的某条边后,图不再连通.这样的 ...

  9. ZOJ 2588 求割边问题

    题目链接:http://vjudge.net/problem/viewProblem.action?id=14877 题目大意: 要尽可能多的烧毁桥,另外还要保证图的连通性,问哪些桥是绝对不能烧毁的 ...

随机推荐

  1. Daily Scrum 10.25

    今天我们在分析数据库的时候发现还有一些这方面知识上的不足,花费一些额外的时间做功课.这说明当时我们的plan没有做好,但是我们基本还处在进度上. 下面是今天的Task统计:

  2. Hibernate的一级二级缓存机制配置与测试

    特别感谢http://www.cnblogs.com/xiaoluo501395377/p/3377604.html 在本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session ...

  3. 导出查询结果到excle

    实现功能 输入查询结果 点击导出查询结果 导出到excle表.

  4. c# 基础部分 (基本数据类型-- 表达式)

    一 基础部分 1.常用的基本数据类型 int  longing(长整) shortint(短整) string(文本型) char(字符型) bool (布尔型) false true 2.常量于变量 ...

  5. Js navigator.onLine 获取设备是否可以上网、连接网络

    http://zccst.iteye.com/blog/2194229 获取用户的联网状态 if (navigator && navigator.onLine === false) { ...

  6. love your life

    However mean your life is, meet it and live it ;do not shun it and call it hard names. It is not so ...

  7. 【转】java开源类库pinyin4j的使用

    最近CMS系统为了增加查询的匹配率,需要增加拼音检索字段,在网上找到了pinyin4j的java开源类库,提供中文转汉语拼音(并且支持多音字), 呵呵,看了看他的demo,决定就用它了,因为我在实际使 ...

  8. scp使用加密算法报错unknown cipher type

    为了提高scp的传输速度指定了scp的加密算法为arcfour $ scp -c arcfour localFile userName@remoteIP:remoteFile 得到报错unknown ...

  9. python 正则使用笔记

    python正则使用笔记 def remove_br(content): """去除两边换行符""" content = content.r ...

  10. Thinking in Java——笔记(10)

    Inner Classes It allows you to group classes that logically belong together and to control the visib ...