ZOJ3508 The War 贪心,最大流

来源:互联网 发布:网络dns错误是什么原因 编辑:程序博客网 时间:2024/05/17 05:03
                   传送门:I Am Here

常规解法是贪心,但是在复习最大流的写法,因此用sap来写的。思路是很好想的

#include<cstdio>#include<cstdlib>#include<iostream>#include<cstring>#include<algorithm>#include<memory.h>#include<cmath>using namespace std;const int M=2510000;int s,t,cnt;int a[4000],b[4000],num[1010];;const int inf=1000000;int vd[4001],dis[4001],ans,m,n;int Laxt[M],Next[M],Val[M],To[M];void _update(){memset(vd,0,sizeof(vd));memset(dis,0,sizeof(dis));memset(a,0,sizeof(a));memset(b,0,sizeof(b));      memset(To,0,sizeof(To));      memset(num,0,sizeof(num));      memset(Laxt,0,sizeof(Laxt));      memset(Next,0,sizeof(Next));memset(Val,0,sizeof(Val));ans=0;cnt=2;//不从0开始最好s=0;t=1000+n+1; }void _add(int u,int v,int w){Next[cnt]=Laxt[u];Laxt[u]=cnt;To[cnt]=v;Val[cnt++]=w;Next[cnt]=Laxt[v];Laxt[v]=cnt;To[cnt]=u;Val[cnt++]=0;}int dfs(int u,int flow){        int temp,delta;      if(u==t)return flow;      delta=0;      for(int i=Laxt[u];i>0;i=Next[i]) //这里的0限制了cnt不从0开始          if(Val[i]>0 && dis[u]==dis[To[i]]+1)          {             temp=dfs(To[i],min(flow-delta,Val[i]));             Val[i]-=temp;             Val[i^1]+=temp;             delta+=temp;             if(delta==flow||dis[s]>t) return delta;         }      vd[dis[u]]--;      if(vd[dis[u]]==0)dis[s]=t+1;      dis[u]++;      vd[dis[u]]++;      return delta;}void _work(){   int i,j,x,y;        for(i=1;i<=n;i++) 
         cin>>a[i]>>b[i];  for(i=1;i<=m;i++) {     cin>>x;     num[x]++;  }  for(i=1;i<=1000;i++)   if(num[i]>0)    _add(s,i,num[i]);  for(i=1;i<=1000;i++)    for(j=1;j<=n;j++){  if(i>=a[j]&&i<=b[j])  _add(i,1000+j,1);   }   for(j=1;j<=n;j++)    _add(1000+j,t,1);  int temp=0;     while(dis[s]<t+1)     {         int flow=dfs(s,inf);         ans+=flow;     }     cout<<ans<<endl; }int main(){      while(cin>>n>>m) {  _update();     _work();} return 0;}