Internship
zoj2532:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1532
题意:有n个发射点,m个中继站,然后发射点会发射一些信息给汇点0,这些信息可能会经过中继站,然后给出l条边,每一条都有一个信息容量,现在问你改变哪些边中的任意一条都可以改变这n个点发射信息到0点的总和。
题解:首先,分析一下,要改变的这一条边具有一下性质:
1 这一条边一定是满流的,
2边的起点应该属于残余网络的源点部分,
3边的终点应该是属于残余网络的汇点部分。
所以建图的时候,设置超级源点ss,然后与每个发射点连接,容量是INF,然后跑网络流,从源点深搜,再从汇点神搜,最后遍历每一边,看是否满足以上3条性质。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<queue>
#define INF 100000000
using namespace std;
const int N=;
const int M=;
struct Node{
int v;
int f;
int next;
}edge[M];
int n,m,u,v,l,w,cnt,sx,ex;
int head[N],pre[N];
int ans[N],top;
int from[N],to[N];
bool vis1[N],vis2[N];
void init(){
cnt=;
memset(head,-,sizeof(head));
memset(vis1,,sizeof(vis1));
memset(vis2,,sizeof(vis2));
}
void add(int u,int v,int w,int id){
edge[cnt].v=v;
edge[cnt].f=w;
edge[cnt].next=head[u];
head[u]=cnt++;
edge[cnt].f=;
edge[cnt].v=u;
edge[cnt].next=head[v];
head[v]=cnt++;
}
bool BFS(){
memset(pre,,sizeof(pre));
pre[sx]=;
queue<int>Q;
Q.push(sx);
while(!Q.empty()){
int d=Q.front();
Q.pop();
for(int i=head[d];i!=-;i=edge[i].next ){
if(edge[i].f&&!pre[edge[i].v]){
pre[edge[i].v]=pre[d]+;
Q.push(edge[i].v);
}
}
}
return pre[ex]>;
}
int dinic(int flow,int ps){
int f=flow;
if(ps==ex)return f;
for(int i=head[ps];i!=-;i=edge[i].next){
if(edge[i].f&&pre[edge[i].v]==pre[ps]+){
int a=edge[i].f;
int t=dinic(min(a,flow),edge[i].v);
edge[i].f-=t;
edge[i^].f+=t;
flow-=t;
if(flow<=)break;
} }
if(f-flow<=)pre[ps]=-;
return f-flow;
}
void solve(){
int sum=;
while(BFS())
sum+=dinic(INF,sx);
}
void DFS1(int u,int fa){
if(vis1[u])return;
vis1[u]=;
for(int i=head[u];i!=-;i=edge[i].next){
if(edge[i].f>){
DFS1(edge[i].v,u);
}
}
}
void DFS2(int u,int fa){
if(vis2[u])return;
vis2[u]=;
for(int i=head[u];i!=-;i=edge[i].next){
if(edge[i^].f>){
DFS2(edge[i].v,u);
}
}
}
int main() {
while(~scanf("%d%d%d",&n,&m,&l)&&n) {
init();
for(int i=;i<=l;i++){
scanf("%d%d%d",&from[i],&to[i],&w);
add(from[i],to[i],w,i);
}
for(int i=;i<=n;i++){
add(m+n+,i,INF,);
}
sx=n+m+,ex=;
solve();
DFS1(sx,sx);
DFS2(ex,ex);
top=;
for(int i=;i<=l;i++){
int u=from[i],v=to[i];
if(vis1[u]&&vis2[v])
ans[++top]=i;
}
if(top==)puts("");
else{
sort(ans+,ans+top+);
for(int i=;i<top;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[top]);
}
}
return ;
}
Internship的更多相关文章
- ZOJ 2532 Internship 求隔边
Internship Time Limit: 5 Seconds Memory Limit: 32768 KB CIA headquarter collects data from acro ...
- ZOJ 2532 Internship
Internship Time Limit: 5000ms Memory Limit: 32768KB This problem will be judged on ZJU. Original ID: ...
- ZOJ 1532 Internship (Dinic)
看来模板又错了,敲你妈妈小饼干 #include<iostream> #include<queue> #include<cstring> #include<c ...
- Tinkoff Internship Warmup Round 2018 and Codeforces Round #475 (Div. 1)D. Frequency of String
题意:有一个串s,n个串模式串t,问s的子串中长度最小的包含t k次的长度是多少 题解:把所有t建ac自动机,把s在ac自动机上匹配.保存每个模式串在s中出现的位置.这里由于t两两不同最多只有xsqr ...
- B - Internship (网络流关键割边)
题目链接:https://cn.vjudge.net/contest/281961#problem/B 题目大意:给你n个城市,中间有一些中转站,然后给你终点,再给你l条轨道以及流量,问你增加哪几条轨 ...
- 面经:Bloomberg Internship第一轮
上来先问了一个系统设计的问题,一个front end, 一个back end. front end有很多UI,一个UI对10个多customers,back end有许多processor,或者pro ...
- ZOJ 2532 Internship(最大流找关键割边)
Description CIA headquarter collects data from across the country through its classified network. Th ...
- Tinkoff Internship Warmup Round 2018 and Codeforces Round #475 (Div. 2)
A. Splits time limit per test 1 second memory limit per test 256 megabytes input standard input outp ...
- zoj 2532 Internship【最小割】
就是求哪些边在最大流上满流,也就是找割边.把0作为t点,s向所有的1~n连流量为inf的边,其他的边按照流量连.跑一遍最大流,从s顺着有残余流量的正向边dfs打标记fr,从t顺着正向边有残余流量的反向 ...
随机推荐
- oracle17 视图
oracle的视图 介绍 视图是一个虚拟表是一个表,其内容由查询定义,同真实的表一样,视图包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储的数据值集形式存在(视图不实际存在).行和列数据 ...
- oracle16 例外
例外处理 例外的分类 oracle将例外分为预定义例外,非预定义例外和自定义例外三种. 预定义例外用于处理常见的oracle错误 非预定义例外用于处理预定义例外不能处理的例外 自定义例外用于处理与or ...
- VC/MFC强制退出本进程自己,VC/MFC关闭自己
正常情况下通过关闭主窗口close或发送PostQuitMessage(WM_QUIT);消息 能关闭窗口.但如果一个进程中包括多个子线程当子线程没有结束还占用 系统资源时通过上面的两种方法是不能立即 ...
- FolderBrowserDialog使用
private void button_browse_Click(object sender, EventArgs e) { FolderBrowserDialog fbd = new FolderB ...
- JDK1.8聚合操作
在java8 JDK包含许多聚合操作(如平均值,总和,最小,最大,和计数),返回一个计算流stream的聚合结果.这些聚合操作被称为聚合操作.JDK除返回单个值的聚合操作外,还有很多聚合操作返回一个c ...
- 傻瓜式理解递归之php递归
写程序这么久了,有时候别人会问道一些算法比如排序啊,递归啊,总是不知道该怎么去说,今天就来整理一下,让更多的人去傻瓜式的理解递归.递归在网络上有很多定义,但有这么一句话听的最多:递归就是自己调用自己! ...
- Visual Studio的性能测试工具
vs果然是宇宙最强大的IDE,这句话我经常挂在嘴边,反正觉得它挺强大 整个听技术经理说性能测试,然后我就觉得宇宙最强大的IDE应该 也有测试工具吧,那么我就百度了一下,又看看vs的选项,果然真有一个性 ...
- A题笔记(3)
No. 1381 容器相关 #include <vector> 头文件 vector<Presents> present; present.push_back(name); 向 ...
- MVC权限模块
设计方向: 1.摒弃SiteMap,避免在容易书写错误的sitemap中书写,导航在controller和action上打标签生成. 2.controller统一继承basecontroller,在b ...
- WPF AutoGeneratingColumn 绑定下拉框
WPF自动产生列,前台代码: <DataGrid x:Name="Dg" AutoGenerateColumns="True" CanUserAddRow ...