既然已经进SCUACM冬季集训了
那就学点感兴趣的东西吧!
从网络流先开始OvO
最大流
反正一个最基础的想法就是,建反向边,然后贪心。
感觉增广路也是为我的贪心服务。
我也不知道我的是什么方法反正loj模板题过了。。。
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int M=5010;
const int N=210;
int fi[M*2],ne[M*2],la[M*2],a[M*2],c[M*2];
long long ans;
int d[N],head[N];
int i,j,k,n,m,x,y,z,s,t;
void add(int x,int y,int t){
k++;a[k]=y;c[k]=t;
if (fi[x]==0)fi[x]=k;else ne[la[x]]=k;
la[x]=k;
}
long long dfs(int x,long long T){
long long w=0;
if (x==t)return T;
for (int i=head[x];i;i=ne[i]){
head[x]=ne[i];
if (d[a[i]]==d[x]+1&&c[i]){
long long te=dfs(a[i],min(1ll*c[i],T));
c[i]-=te;c[i^1]+=te;T-=te;w+=te;
if (!T)break;
}
}
if (!w)d[x]=-1;
return w;
}
queue<int>q;
int bfs(){
memset(d,-1,sizeof d);
d[s]=0;
q.push(s);
while (!q.empty()){
x=q.front();q.pop();
for (int i=fi[x];i;i=ne[i])
if (c[i]&&d[a[i]]==-1){
d[a[i]]=d[x]+1;
q.push(a[i]);
}
}
for (i=1;i<=n;i++)head[i]=fi[i];
return d[t]!=-1;
}
int main(){
scanf("%d%d%d%d",&n,&m,&s,&t);k=1;
for (i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,0);
}
while (bfs())ans+=dfs(s,1ll<<40);
printf("%lld\n",ans);
return 0;
}
没有代码高亮差评
重装了一个插件现在有了
但是加强版就过不了。。还需优化。。
Comments | NOTHING