题目链接:https://vjudge.net/contest/144904#problem/A

题意:给定一个有向网络,每条边均有一个容量。问是否存在一个从点1到点N,流量为C的流。如果不存在,是否可以恰好修改一条弧的容量,使得存在这样的流?

分析:

首先找到最大流,如果发现大于等于C,就得到解,如果小于C的话,枚举最小割。这时,之前的最大流保存下来,清空流量,改变最小割的容量,再求最大流。

include <bits/stdc++.h>
using namespace std; const int maxn = + ;
const int INF = 0x3f3f3f3f; struct Edge {
int from,to,cap,flow;
}; bool operator < (const Edge& a,const Edge& b) {
return a.from < b.from || (a.from==b.from&&a.to<b.to);
} struct Dinic {
int n,m,s,t;
vector<Edge> edges;
vector<int> G[maxn];
bool vis[maxn];
int d[maxn];
int cur[maxn]; void init(int n) {
for(int i=;i<n;i++)
G[i].clear();
edges.clear();
} void ClearFlow() {
for(int i=;i<edges.size();i++) {
edges[i].flow = ;
}
} void AddEdge(int from,int to,int cap) {
edges.push_back((Edge){from,to,cap,});
edges.push_back((Edge){to,from,,});
m = edges.size();
G[from].push_back(m-);
G[to].push_back(m-);
} bool BFS() {
memset(vis,,sizeof(vis));
queue<int> Q;
Q.push(s);
vis[s] = ;
d[s] = ;
while(!Q.empty()) {
int x = Q.front();
Q.pop();
for(int i=;i<G[x].size();i++) {
Edge& e = edges[G[x][i]];
if(!vis[e.to]&&e.cap>e.flow) {
vis[e.to] = ;
d[e.to] = d[x] + ;
Q.push(e.to);
}
}
}
return vis[t];
} int DFS(int x,int a) {
if(x==t||a==) return a;
int flow =,f;
for(int& i=cur[x];i<G[x].size();i++) {
Edge& e = edges[G[x][i]];
if(d[x]+==d[e.to]&&(f=DFS(e.to,min(a,e.cap-e.flow)))>) {
e.flow +=f;
edges[G[x][i]^].flow -=f;
flow +=f;
a-=f;
if(a==) break;
}
}
return flow;
} int Maxflow(int s,int t) {
this->s = s;
this->t = t;
int flow = ;
while(BFS()) {
memset(cur,,sizeof(cur));
flow +=DFS(s,INF);
}
return flow;
} vector<int> Mincut() {
vector<int> ans;
for(int i=;i<edges.size();i++) {
Edge& e = edges[i];
if(vis[e.from]&&!vis[e.to]&&e.cap>)
ans.push_back(i);
}
return ans;
} void Reduce () {
for(int i=;i<edges.size();i++)
edges[i].cap -=edges[i].flow;
} }; Dinic g; int main()
{
int kase = ;
int n,e,c;
while(scanf("%d%d%d",&n,&e,&c)==&&n) {
g.init(n);
for(int i=;i<e;i++) {
int u,v,cap;
scanf("%d%d%d",&u,&v,&cap);
u--;v--;
g.AddEdge(u,v,cap);
}
printf("Case %d: ",kase ++);
int flow = g.Maxflow(,n-);
if(flow>=c) printf("possible\n"); else {
vector<int> cut = g.Mincut();
g.Reduce();
vector<Edge> ans;
for(int i=;i<cut.size();i++) {
Edge& e = g.edges[cut[i]];
int temp = e.cap; ///
e.cap = c;
g.ClearFlow();
if(flow+g.Maxflow(,n-)>=c)
ans.push_back(e);
e.cap = temp; ///
}
if(ans.empty())
printf("not possible\n");
else {
sort(ans.begin(),ans.end());
printf("possible option:(%d,%d)",ans[].from+,ans[].to + );
for(int i=;i<ans.size();i++) {
printf(",(%d,%d)",ans[i].from+,ans[i].to+);
}
puts("");
}
}
} return ;
}

Uva 11248 网络扩容的更多相关文章

  1. UVa 11248 网络扩容(最大流(需要优化))

    https://vjudge.net/problem/UVA-11248 题意: 给定一个有向网络,每条边均有一个容量.问是否存在一个从点1到点N,流量为C的流.如果不存在,是否可以恰好修改一条弧的容 ...

  2. UVA 11248 - Frequency Hopping(网络流量)

    UVA 11248 - Frequency Hopping 题目链接 题意:给定一个网络,如今须要从1到N运输流量C,问是否可能,假设可能输出可能,假设不可能,再问能否通过扩大一条边的容量使得可能,假 ...

  3. uva 11248 Frequency Hopping (最大流)

    uva 11248 Frequency Hopping 题目大意:给定一个有向网络,每条边均有一个容量. 问是否存在一个从点1到点N.流量为C的流.假设不存在,能否够恰好改动一条弧的容量,使得存在这种 ...

  4. C++之路进阶——codevs1362(网络扩容)

    1362 网络扩容 省队选拔赛  时间限制: 2 s  空间限制: 128000 KB  题目等级 : 大师 Master     题目描述 Description 给定一张有向图,每条边都有一个容量 ...

  5. BZOJ-1834 网络扩容 最小费用最大流+最大流+乱搞

    1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec Memory Limit: 64 MB Submit: 2269 Solved: 1136 [Submit ...

  6. 【BZOJ】【1834】【ZJOI2010】Network 网络扩容

    网络流/费用流 这题……我一开始sb了. 第一问简单的最大流…… 第二问是要建费用流的图的……但是是在第一问的最大流跑完以后的残量网络上建,而不是重建…… 我们令残量网络上原有的弧的费用全部为0(因为 ...

  7. bzoj1834: [ZJOI2010]network 网络扩容

    努力看了很久样例一直过不了...然后各种输出中间过程啊巴拉巴拉弄了1h,没办法了...然后突然想到啊原来的边可以用啊为什么不用...于是A了...感人肺腑 #include<cstdio> ...

  8. BZOJ 1834: [ZJOI2010]network 网络扩容(最大流+最小费用最大流)

    第一问直接跑最大流.然后将所有边再加一次,费用为扩容费用,容量为k,再从一个超级源点连一条容量为k,费用为0的边到原源点,从原汇点连一条同样的边到超级汇点,然  后跑最小费用最大流就OK了. ---- ...

  9. 【BZOJ1834】网络扩容(最大流,费用流)

    [BZOJ1834]网络扩容(最大流,费用流) 题面 Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下 ...

随机推荐

  1. Win32 设置窗口透明度 SetLayerTransparent

    注意: 在调用SetLayeredWindowAttributes 之前,需要给窗口加上WS_EX_LAYERED属性,否则会无效 void SetLayerTransparent(HWND hWnd ...

  2. WordPress基础:Gravatar头像修正

    WordPress会根据你的邮箱,从Gravatar获取你的头像,如果没有在Gravatar设置头像,将使用默认的,然而设置了之后显示还可能会出现以下问题: Gravatar头像读取困难,将影响网站读 ...

  3. VS2013自带的Browser Link功能引发浏览localhost网站时不停的轮询

    浏览localhost网站时候不管你打开那个页面它都会不停的轮询.据悉这是VS2013自带的Browser Link功能,里面用到SignalR机制 什么是Browser Link功能,什么是Sign ...

  4. 网络编程学习笔记:linux下的socket编程

    socket是进程通信的一种方式,通过调用一些API可以实现进程间通信,建立连接以及收发信息的过程如下图所示: 这些函数的用法如下: 1.int socket(int protocolFamily, ...

  5. SQLServer一次性删除重复的数据

    delete from [GCPCore].[GCP.Product].[CityMall] where  AreaID in(select AreaID from [GCPCore].[GCP.Pr ...

  6. hadoop(2014/0619)

    map-reduce :分解任务和合并任务的能力 hdfs: namenode and datanode namenode放置元数据 datanoe放置数据

  7. android中如何获取xml界面里的非自定义属性

    获取自定义属性大家都很熟悉了,就不多说了(定义declare-styleable,context.obtainStyledAttributes巴拉巴拉...) 下面我们说一下怎么获取非自定义的属性,比 ...

  8. HTML5零基础学习Web前端需要知道哪些?

    HTML零基础学习Web前端网页制作,首先是要掌握一些常用标签的使用和他们的各个属性,常用的标签我总结了一下有以下这些: html:页面的根元素. head:页面的头部标签,是所有头部元素的容器. b ...

  9. oracle or语句的坑

    SELECT SUM(tjo.pay_amount) FROM tb_jf_order tjo,tb_jf_gateway_trade_log tjg WHERE tjo.order_id = tjg ...

  10. SecureCRT连接VirtualBox下的ubuntu以及NMP的搭建与通过宿主机访问该NGINX服务器过程

    一直使用wamp作为开发环境,只是工作中时常会遇到在wamp下没问题但是提交到服务器生产环境会出现一些意想不到的情况,由此萌生了在本机搭建LNMP环境的想法,我个人不知道其他人的虚拟机搭建服务器环境是 ...