[BZOJ1779][Usaco2010 Hol]Cowwar 奶牛战争(网络流)

来源:互联网 发布:用java编写菱形 编辑:程序博客网 时间:2024/05/08 01:46

题目:

我是超链接

题解:

ZZ读题障碍患者:关于“不能先攻击再移动”这句话的理解大概是只能选择攻击一次/移动一次/移动+攻击一次
好久之前学长的胡策题(m=n-1),竟然良心的不用输出方案
网络流
建立超级源超级汇,建图见图
这里写图片描述
各边容量都是1,那么很奇怪呀,为什么n*2+i这一列不能省略呢?
其实我这个图就是栗子,显然这个图的意思是本来两头J都不能攻击到T,但是通过E的中转可以攻击到二者,但是E只能做一头牛的中转啊,然后那头牛就既不能攻击也不能动了,就卡在E这里,所以只能攻击到一头T
但如果我们省略掉那一列,E就只作为中转而并不能限制流量,会输出可以攻击两头T

代码:

#include <queue>#include <cstdio>#include <cstring>#include <iostream>#define INF 1e9using namespace std;const int N=4005;int tot=-1,point[N],dis[N],cur[N],nxt[N*4+5],v[N*4+5],remind[N*4+5],lian[1005][1005];void addline(int x,int y,int cap){    ++tot; nxt[tot]=point[x]; point[x]=tot; v[tot]=y; remind[tot]=cap;    ++tot; nxt[tot]=point[y]; point[y]=tot; v[tot]=x; remind[tot]=0;}int dfs(int now,int t,int limit){    if (now==t || !limit) return limit;    int flow=0,f;    for (int i=cur[now];i!=-1;i=nxt[i])    {        cur[now]=i;        if (dis[v[i]]==dis[now]+1 && (f=dfs(v[i],t,min(limit,remind[i]))))        {            flow+=f;            limit-=f;            remind[i]-=f;            remind[i^1]+=f;            if (!limit) break;        }    }    return flow;}bool bfs(int s,int t){    queue<int>q;    for (int i=s;i<=t;i++) cur[i]=point[i];    q.push(s);    memset(dis,0x7f,sizeof(dis));    dis[s]=0;    while (!q.empty())    {        int x=q.front(); q.pop();        for (int i=point[x];i!=-1;i=nxt[i])          if (dis[v[i]]>INF && remind[i])          {q.push(v[i]); dis[v[i]]=dis[x]+1;}    }    return dis[t]<INF;}int dinic(int s,int t){    int ans=0;    while (bfs(s,t)) ans+=dfs(s,t,INF);    return ans;}int main(){    int n,m;char st[N];    memset(nxt,-1,sizeof(nxt));    memset(point,-1,sizeof(point));    scanf("%d%d",&n,&m);    scanf("%s",st+1);    for (int i=1;i<=m;i++)    {        int x,y;scanf("%d%d",&x,&y);        lian[x][++lian[x][0]]=y;        lian[y][++lian[y][0]]=x;    }    for (int i=1;i<=n;i++)    {        if (st[i]=='J')         {            addline(0,i,1);            addline(i,i+n,1);            for (int j=1;j<=lian[i][0];j++)              if (st[lian[i][j]]!='T')                addline(i,lian[i][j]+n,1);        }        if (st[i]=='T') addline(i+3*n,4*n+1,1);                                                     }         for (int i=1;i<=n;i++)      if (st[i]!='T')      {        addline(i+n,i+2*n,1);        for (int j=1;j<=lian[i][0];j++)          if (st[lian[i][j]]=='T')            addline(i+2*n,lian[i][j]+3*n,1);      }    printf("%d",dinic(0,4*n+1));}
阅读全文
'); })();
1 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 蕾的拼音 蕾拼音 艾蕾欧诺拉 蕾伊 蕾姆 蕾姆h 蕾姆的结局 蕾姆的告白 蕾姆照片 蕾姆1080高清图片 蕾姆高清图片 与蕾姆一起x交下载 蕾姆手办 蕾姆英文 蕾姆图 蕾姆日语 蕾娜 寄生内裤蕾娜 蕾字几画 蕾字在人名中的意思 带蕾字优雅的昵称 蕾的形近字 蕾拉 蕾比 蕾玖 蕾玖吻路飞娜美为什么要脸红 蕾琳的产品价格表 蕾莎 蕾蒂 蕾蒂整形 蕾蕾 蕾蕾纯色 微商蕾蕾本人到底是谁 蕾蕾一键bob软件下载 蕾蕾纯色婚纱照怎么样 蕾蕾的小麦霸们资料 蕾蕾的小麦霸们 蕾的意思 蕾的读音 蕾蕾美颜 蕾读音