HDU 4289 Control(拆点+最大流)

来源:互联网 发布:矩阵切换系统 编辑:程序博客网 时间:2024/05/29 16:06

请不要随便指点别人该怎么做、每个人的人生都应该自己掌握、你给不了别人一切、你也不懂别人的忧伤、

                                                                                          微笑不代表快乐、哭泣不一定悲伤

               不努力怎么让关心你的人幸福、不努力怎么让看不起你的人绝望、

                                                                                                                                    

                                                                                                                                                              我用生命在奋斗——lx_Zz

—————————————————————————————————————————————————————————————

—————————————————————————    华丽的分割线    ————————————————————————————

—————————————————————————————————————————————————————————————

这是一道2012年成都网络赛被大家秒杀的水题

我对自己都无语了、我看到这题以为自己可以分分钟AC掉。。。不就是个赤果果的拆点么。。结果硬是调了一晚上哭

C++实验课就这样被这题耗掉了。。。想死的心都有了。。还好下课之前终于发现自己建图的时候傻逼的忘记反向建边了。。。给跪了

46给我再去相信的勇气、31MS1204K3268BC++2014-05-06 20:46:24效率还是不错的、下次再也不能这么逗了。。。快哭了


#include<stdio.h>  #include<string.h>  #include<queue>  #include<algorithm>  using namespace std;  #define N 405  #define INF 0x7fffffff int n,m,k;  int level[N];  struct node  {      int to,next;    int cost;  }edge[N*N];  int head[N];  int t_head[N];  int num[N]; int start,end;void init()  {      k=0;      memset(head,-1,sizeof(head));  }  int bfs(int s,int t)//对顶点进行标号、找出层次图  {      memset(level,0,sizeof(level));      queue<int>q;      q.push(s);      level[s]=1;      while(!q.empty())      {          int now=q.front();          q.pop();          int i;        for( i=head[now];i!=-1;i=edge[i].next)          {              int y=edge[i].to;              if(!level[y]&&edge[i].cost>0)              {                  level[y]=level[now]+1;                  q.push(y);              }          }      }      return level[t]!=0;//汇点是否在层次图中  } int minn(int x,int y){    if(x<y)return x;    return y;}int dfs(int s,int cp)//在层次图中寻找增广路进行增广  {      int flow=0,temp;      int t;      if(s==end||cp==0)return cp;      for(;t_head[s]+1;t_head[s]=edge[t_head[s]].next)      {          int y=edge[t_head[s]].to;          if(level[s]+1==level[y])          {              temp=dfs(y,minn(cp,edge[t_head[s]].cost));              if(temp>0)              {                  edge[t_head[s]].cost-=temp;                  edge[t_head[s]^1].cost+=temp;                  flow+=temp;                  cp-=temp;                  if(cp==0)break;              }          }      }      return flow;  }    int dinic()  {      int ans=0,flow=0;    int i;    while(bfs(start,end))//汇点不在层次图中、算法终止      {          for( i=0;i<=end;i++)              t_head[i]=head[i];          ans+=dfs(start,INF);      }      return ans;  }  void add(int x,int y,int val)  {      edge[k].to=y;      edge[k].cost=val;      edge[k].next=head[x];      head[x]=k++;        edge[k].to=x;      edge[k].cost=0;      edge[k].next=head[y];      head[y]=k++;  }  int main(){    //freopen("C:\\Users\\终将我要华丽的逆袭\\Desktop\\lx_Zz_in.txt","r",stdin);    //freopen("C:\\Users\\终将我要华丽的逆袭\\Desktop\\lx_Zz_out.txt","w",stdout);    while(scanf("%d%d",&n,&m)!=EOF)    {        init();        int x,y;        start=0;end=200+n+1;        scanf("%d%d",&x,&y);        int i;        add(start,x,INF);        add(y+200,end,INF);        for( i=1;i<=n;i++)        {            scanf("%d",&num[i]);        }        for( i=1;i<=n;i++)        {            add(i,i+200,num[i]);            add(i+200,i,num[i]);        }        for( i=1;i<=m;i++)        {            int a,b;            scanf("%d%d",&a,&b);            add(a+200,b,INF);            add(b+200,a,INF);        }        printf("%d\n",dinic());    }    return 0;}


2 0
原创粉丝点击