ACM确实是需要毅力的东西,最近刷网络流,竭尽全力的一个ac。。。
把题目中的模型转换成最小割模型,然后就是模版了
为什么是最小割?因为显然任意一个割中模块只能多放不能少,而满足条件的一定是一个割,所以满足条件的就是极小割,所有极小割也满足条件,最小割是极小割,所以花费最小的就是最小割
但是却百思不得其解的tle了,纠结,死都发现不了前几天自己写的那个模版里有什么问题,多路增广啊,gap优化也用了啊。。ac不能。。。纠结的一塌糊涂。。。然后怀疑是vector的问题,但是有人用vector ac了啊!!!
搞了2,3个小时,最后决定重敲一遍,凭着自己的感觉,在愤怒之下。。。在即将放弃dinic和stl下。。。在编译都没编译的情况下。。。提交了。。奇迹般的ac了。。最后发现是建图的地方写错了。。汗!!确实。。邻接表建图那里真坑爹!!这寒假都没干什么,时间就这样木有了。。
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iomanip>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=21111;
struct zz
{
int from;
int to;
int c;
int id;
}zx,tz;
vector<zz>g[maxn];
queue<int>q;
int cen[maxn];
int n,m,s,t;
bool bfs()
{
while(!q.empty())
{
q.pop();
}
memset(cen,-1,sizeof(cen));
q.push(0);
cen[0]=0;
int now,to;
while(!q.empty())
{
now=q.front();
q.pop();
for(int i=0;i<g[now].size();i++)
{
to=g[now][i].to;
if(g[now][i].c > 0 && cen[to] == -1)
{
cen[to] = cen[now] +1;
q.push(to);
}
}
}
return cen[n+1] != -1;
}
int dfs(int flow=inf,int now=0)
{
if(cen[now]>=cen[n+1])
{
if(now==n+1)
{
return flow;
}
else
{
return 0;
}
}
int temp,sum=0;
int to;
for(int i=0;i<g[now].size();i++)
{
to = g[now][i].to;
if(g[now][i].c>0 && flow>sum && cen[to]==cen[now]+1 )
if(temp = dfs(min(flow-sum,g[now][i].c),to))
{
sum += temp;
g[now][i].c -= temp;
g[to][g[now][i].id].c += temp;
}
}
if(!sum) cen[now] = -1;
return sum;
}
int dinic()
{
int ans=0;
while(bfs())
{
ans+=dfs();
}
return ans;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&s,&t);
zx.c=s;
zx.from=0;
zx.to=i;
zx.id=g[i].size();
g[0].push_back(zx);
swap(zx.from,zx.to);
zx.id=g[0].size()-1;
zx.c=0;
g[i].push_back(zx);
zx.c=t;
zx.from=i;
zx.to=n+1;
zx.id=g[n+1].size();
g[i].push_back(zx);
swap(zx.from,zx.to);
zx.c=0;
zx.id=g[i].size()-1;
g[n+1].push_back(zx);
}
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&zx.from,&zx.to,&zx.c);
zx.id=g[zx.to].size();
g[zx.from].push_back(zx);
zx.id=g[zx.from].size()-1;
swap(zx.from,zx.to);
g[zx.from].push_back(zx);
}
cout<<dinic()<<endl;
return 0;
}
本文分享了一次解决网络流问题的经历,通过将问题转化为最小割模型并运用Dinic算法求解。文章详细记录了从困惑到调试成功的全过程,包括算法实现细节、常见错误排查技巧等。
5922

被折叠的 条评论
为什么被折叠?



