这题我是用dinic写的,就对了T1,T6,T9 ,其他都 WA 了,但找不到错误在哪,听说灌水区大佬多。求助!!
代码:
#include<bits/stdc++.h>
using namespace std;
#define min(a,b) (a<b?a:b)
const int N=20,M=1e6+10;
const int INF=1e9;
struct Edge{
int v,w,next;
}e[M<<1];
int tot=1,head[M],now[M];
void link(int u,int v,int w)
{
++tot;
e[tot].v=v; e[tot].w=w; e[tot].next=head[u];
head[u]=tot;
}
int n,m,s,t,k,ans;
int dx[4]={0,1,0,-1},
dy[4]={1,0,-1,0};
char mp[N][N];
int dis[M];
bool bfs()
{
for(int i=0;i<=n*m*(k+1)+1;i++)
dis[i]=INF;
queue<int> que;
que.push(s); dis[s]=0; now[s]=head[s];
int u;
while(!que.empty())
{
u=que.front(); que.pop();
for(int i=head[u];i;i=e[i].next)
{
int ne=e[i].v;
if(e[i].w>0&&dis[ne]==INF)
{
que.push(ne);
now[ne]=head[ne];
dis[ne]=dis[u]+1;
if(ne==t) return true;
}
}
}
return false;
}
int dfs(int u,int sum)
{
if(u==t) return sum;
int k,res=0;
for(int i=now[u];i;i=e[i].next)
{
int ne=e[i].v; now[u]=i;
if(e[i].w>0&&dis[ne]==dis[u]+1)
{
k=dfs(ne,(min(e[i].w,sum)));
if(k==0) dis[ne]=INF;
e[i].w-=k; e[i^1].w+=k;
res+=k; sum-=k;
}
}
return res;
}
int main()
{
scanf("%d%d",&n,&m);
scanf("%d",&k);
s=0; t=n*m*(k+1)+1;
for(int i=1;i<=n;i++)
{
scanf("%s",mp[i]+1);
for(int j=1;j<=m;j++)
{
if(mp[i][j]=='P')
{
link(s,(i-1)*n+j,INF);
link((i-1)*n+j,s,0);
}
if(mp[i][j]=='O')
{
for(int p=1;p<=k;p++)
{
link(p*n*m+(i-1)*n+j,t,1);
link(t,p*n*m+(i-1)*n+j,0);
}
}
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(mp[i][j]=='*'||mp[i][j]=='O') continue;
for(int p=0;p<=k;p++)
for(int h=0;h<4;h++)
{
int x=i+dx[h],y=j+dy[h];
if(x<1||x>n||y<1||y>m) continue;
if(mp[x][y]=='*') continue;
link(p*n*m+(i-1)*n+j,(p+1)*n*m+(x-1)*n+y,INF);
link((p+1)*n*m+(x-1)*n+y,p*n*m+(i-1)*n+j,0);
}
}
while(bfs()) ans+=dfs(s,INF);
printf("%d\n",ans);
return 0;
}