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. 注入语句详解(get注入,cookie注入,搜索型注入等)

    注意:对于普通的get注入,如果是字符型,前加'   后加 and ''=' 拆半法 ###################################### and exists (select ...

  2. Greenplum获取表结构

    最近在折腾greenplum,遇到一个蛋疼的问题,那就是获取表结构,也就是建表语句.大家都知道在MySQL里面是非常easy的,show create table table_name 就搞定了,在g ...

  3. 【iCore3 双核心板_FPGA】例程十:锁相环实验——锁相环使用

    实验指导书及代码包下载: http://pan.baidu.com/s/1boeODjx iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  4. 为Docker容器指定自定义网段的固定IP/静态IP地址

    第一步:创建自定义网络 备注:这里选取了172.172.0.0网段,也可以指定其他任意空闲的网段 docker network create --subnet=172.172.0.0/16 docke ...

  5. chmod() has been disabled for security reasons

    最近用 codeigniter 写一个小系统,引用了session 库,codeigniter默认的session存储方式为files.鉴于安全性,文件即肯定涉及到权限问题. 在类 UNIX 操作系统 ...

  6. mvc 扩展htmlhelper

    using System.Web.Mvc; namespace System.Web.Mvc{    public static class HtmlExtend    {        public ...

  7. Java 内存区域划分

            JVM的内存区域划分 学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆.栈以及静态数据区.那么在Java语言当中,内存又是如何划分的 ...

  8. MyArrayAdapter 比较标准的写法

    ; i < mString.size(); i++) { insert(mString.get(i), i); } } notifyDataSetChanged(); LogUtils.LOGD ...

  9. JS-011-颜色进制转换(RGB转16进制;16进制转RGB)

    在网页开发的时候,经常需要进行颜色设置,因而经常需要遇到进行颜色进制转换的问题,例如:RGB转16进制:16进制转RGB),前几天在测试的时候,发现网站的颜色进制转换某类16进制颜色(例如:#0000 ...

  10. 20145320 《Java程序设计》第10周学习总结

    20145320 <Java程序设计>第10周学习总结 教材学习内容总结 网络编程 计算机网络概述 网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输. 按照计算机网络的定义 ...