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                
            

相关内容

热门资讯

山水皆有情!丽江两山一江的千年... 去过丽江、走过虎跳峡的人,大概率都听过哈巴雪山和金沙江的传说。很多人站在峡谷之下,望着奔腾不息的金沙...
活力中国调研行丨“殷”你而来 ... 9月12日,游客在殷墟博物馆“甲骨文展厅”内参观。位于河南省安阳市的殷墟博物馆新馆是首个全景式展现商...
浦江之夜赴美好相逢,第37届上... 9月12日晚,黄浦江畔灯火璀璨,第37届上海旅游节大巡游在外滩中山东一路上演。不少观众早早便来到外滩...
美丽中国丨秋韵紫鹊界 梯田入画... 这是9月11日拍摄的紫鹊界梯田(无人机照片)。 金秋九月,湖南省娄底市新化县紫鹊界梯田稻谷渐次成熟。...
中国之巅奏响《共同的节日》,千... 千吨阻尼器,“迎世赛、游上海旅游节”。9月13日,由上海市文化和旅游局指导推出上海旅游·会客│巅峰之...