求助!
  • 板块灌水区
  • 楼主Silent1019
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/7 20:25
  • 上次更新2024/8/7 21:24:40
查看原帖
求助!
375337
Silent1019楼主2024/8/7 20:25

P3851 [TJOI2007] 脱险

这题我是用dinic写的,就对了T1T1,T6T6,T9T9 ,其他都 WAWA 了,但找不到错误在哪,听说灌水区大佬多。求助!!

代码:

#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;
}
2024/8/7 20:25
加载中...