hdoj 3549 Flow Problem 【最大流】
admin
2024-02-08 17:40:54

题目:hdoj 3549 Flow Problem

题意:给出一个图,让你求最大流。

分析:这个题目用dinci写的,因为点比较少,而dinci复杂度O(m*n^2),但是还是跑了160ms,不知道15的神牛怎么写的。

dinci的写法要注意的地方就是存图的时候要考虑怎么存,因为要更新网络残量,即反向的流量,所以这里要注意一下。

思想就不讲了,很多地方有讲。

代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define Del(a,b) memset(a,b,sizeof(a))
const int N = 20;
const int inf = 0x3f3f3f3f;
int n,m;
struct Node
{int from,to,cap,flow;
};
vector v[N];
vector e;
int vis[N];  //
void add_Node(int from,int to,int cap)
{e.push_back((Node){from,to,cap,0});e.push_back((Node){to,from,0,0});int tmp=e.size();v[from].push_back(tmp-2);v[to].push_back(tmp-1);
}
bool bfs(int s,int t)
{Del(vis,-1);queue q;q.push(s);vis[s] = 0;while(!q.empty()){int x=q.front();q.pop();for(int i=0;itmp.flow)  //第二个条件保证{vis[tmp.to]=vis[x]+1;q.push(tmp.to);}}}if(vis[t]>0)return true;return false;
}
int dfs(int o,int f,int t)
{if(o==t || f==0)return f;int a = 0,ans=0;for(int i=0;i0){tmp.flow+=a;e[v[o][i]^1].flow-=a; //存图方式ans+=a;f-=a;}}return ans;  //优化
}
int dinci(int s,int t)
{int ans=0;while(bfs(s,t)){int tm=dfs(s,inf,t);//printf("%d\n",tm);ans+=tm;}return ans;
}
int main()
{//freopen("Input.txt","r",stdin);int T;scanf("%d",&T);for(int cas=1;cas<=T;cas++){scanf("%d%d",&n,&m);for(int i=0;i                
            

相关内容

热门资讯

六问稻城亚丁景区封堵省道收费 ... 近日,有博主发布视频称,四川省甘孜州稻城县稻城亚丁景区将S462省道纳入景区管控,强制游客乘坐收费摆...
原创 夏... 夏天湿热重、脾胃易虚寒,这4道汤健脾祛湿、暖胃护胃、清热不伤阳,适合连续两个月常喝,步骤清晰、做法简...
明日四月十六,记得“吃4样,做... 明日农历四月十六,记得“吃4样,做1事”五谷丰登迎福气,老传统别丢! 时光如梭,转眼间来到了农历四月...
今年目标全国销售网点突破200... 5月16日下午6点,贵阳市吾茶白·贵茶潮饮烘焙概念店里排起小队。 “就要这款,上次喝完一直惦记着。”...
原创 淄... 很多人认识淄博只靠烧烤但真正撑起淄博饮食底蕴的从来不是网红热度而是一代代扎根老城的老字号烟火。这些老...