| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
发一份代码。如果要看题解的话最好看论文。Amber大牛《最小割模型在信息学竞赛中的应用》。。
注意long long..然后统计被删去的点的时候直接把与源点相连的点(和与他们相连的点 统计出来即可。
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <string>
#include <cstring>
#include <cmath>
#include <ctime>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <vector>
#define REP(I,A,B) for(int I=A,_END_=B;I<=_END_;I++)
#define REPD(I,A,B) for(int I=A,_END_=B;I>=_END_;I--)
#define RI(X) X=Readint()
#define RII(X,Y) RI(X),RI(Y)
#define RIII(X,Y,Z) RI(X),RI(Y),RI(Z)
#define RS(X) scanf("%s",X)
#define RD(X) scanf("%lf",&X)
#define GCH getchar()
#define PCH(X) putchar(X)
#define MS(X,Y) memset(X,Y,sizeof(X))
#define MC(X,Y,var,len) memcpy(X,Y,sizeof(var)*(len))
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define pb(X) push_back(X)
#define mp(A,B) make_pair(A,B)
#define fr first
#define sc second
#define lch(p) (p+p)
#define rch(p) (p+p+1)
#define lowbit(X) ((X)&(-(X)))
using namespace std;
typedef pair<int,int> poi;
inline int Readint()
{
int ret=0;
int f=1;
char ch;
do
{
ch=GCH;
if (ch=='-') f*=-1;
}while(ch>=0 && (ch<'0' || ch>'9'));
while ('0'<=ch && ch<='9')
{
ret=ret*10+ch-'0';
ch=GCH;
}
return ret*f;
}
void open()
{
freopen("2987.in","r",stdin);
freopen("2987.out","w",stdout);
}
void close()
{
fclose(stdin);
fclose(stdout);
}
const int MAXN = 5E3+10;
const int MAXM = 6e4*2+MAXN+30;
int n;
int m;
int src,snk;
int w[MAXN]={0};
int tot;
int to[MAXM]={0};
int nxt[MAXM]={0};
long long f[MAXM]={0};
int hd[MAXN]={0};
long long ans=0;
inline void add(const int &x,const int &y,const long long &flow)
{
tot++;
to[tot]=y;
nxt[tot]=hd[x];
f[tot]=flow;
hd[x]=tot;
}
void init()
{
RII(n,m);
src=n+1;
snk=n+2;
tot=-1;
MS(hd,-1);
REP(i,1,n)
{
RI(w[i]);
if (w[i]>0)
{
ans+=w[i];
add(src,i,w[i]);
add(i,src,0);
}
else
{
add(i,snk,-w[i]);
add(snk,i,0);
}
}
int u,v;
REP(i,1,m)
{
RII(u,v);
add(u,v,ans+1);
add(v,u,0);
}
}
const int MAXQ = MAXN + 10;
int dis[MAXN];
int vis[MAXN];
int in[MAXN];
int que[MAXQ+1];
int SPFA()
{
int l=0,r=0;
MS(vis,0);
MS(dis,0);
que[r++]=src;
vis[src]=1;
int now,j;
while (l!=r)
{
now=que[l];
in[now]=0;
if (l==MAXQ) l=0; else l++;
for (int i=hd[now];i!=-1;i=nxt[i])
if (f[i])
{
j=to[i];
if (!vis[j])
{
vis[j]=1;
dis[j]=dis[now]+1;
in[j]=1;
que[r]=j;
if (r==MAXQ) r=0; else r++;
}
else if (dis[j]>dis[now]+1)
{
dis[j]=dis[now]+1;
if (!in[j])
{
in[j]=1;
que[r]=j;
if (r==MAXQ) r=0;
else r++;
}
}
}
}
return vis[snk];
}
long long dfs(int p,long long flow)
{
long long ret=0,tmp;
if (p==snk) return flow;
for (int i=hd[p];i!=-1;i=nxt[i])
if (f[i] && dis[to[i]]==dis[p]+1)
{
tmp=dfs(to[i],min(flow-ret,f[i]));
f[i]-=tmp;
f[i^1]+=tmp;
ret+=tmp;
if (ret==flow) return ret;
}
if (!ret)
dis[p]=0;
return ret;
}
long long maxflow()
{
long long ret=0;
while (SPFA())
ret+=dfs(src,ans+1);
return ret;
}
int cnt=0;
void dfs(int p)
{
vis[p]=1; cnt++;
for (int i=hd[p];i!=-1;i=nxt[i])
if (f[i] && !vis[to[i]])
dfs(to[i]);
}
int main()
{
open();
int _=0;
init();
ans-=maxflow();
MS(vis,0);
cnt=-1;
dfs(src);
printf("%d %I64d\n",cnt,ans);
close();
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator