萌新求助
查看原帖
萌新求助
45475
ShineEternal萌新楼主2019/4/5 19:33

rt,dinic算法惨遭RE

求大佬指教(初学dinic,体会不深之处请多指教

#include<cstdio>
#include<vector> 
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
#define inf 0x7fffffff
int n,m,s,t,ans;
int gx[5]={0,-1,1,0,0};
int gy[5]={0,0,0,-1,1};
int d[45],id[45][45];
char a[45][45];
struct edge
{
	int to,val,rev;
	edge(int _to,int _val,int _rev)
	{
		to=_to;
		val=_val;
		rev=_rev;
	}
};
vector<edge>e[45];
void add(int x,int y,int w)
{
	e[x].push_back(edge(y,w,e[y].size()));
	e[y].push_back(edge(x,0,e[x].size()-1));
}
bool bfs()
{
	memset(d,-1,sizeof(d));
	queue<int>q;
	while(!q.empty())q.pop();
	q.push(s);
	d[s]=0;
	while(!q.empty())
	{
		int x=q.front();
		q.pop();
		for(int i=0;i<e[x].size();i++)
		{
			int y=e[x][i].to;
			if(d[y]==-1&&e[x][i].val)
			{
				q.push(y);
				d[y]=d[x]+1;
			}
		}
	}
	if(d[t]==-1)
	return 0;
	else
	return 1;
}
int dfs(int x,int low)
{
    if(x==t||low==0)return low;
    int totflow=0;
    for(int i=0;i<e[x].size();i++)
    {
        int y=e[x][i].to;
        int rev=e[x][i].rev;
        if(d[y]==d[x]+1&&e[x][i].val)
        {
            int a=dfs(y,min(low,e[x][i].val));
            e[x][i].val-=a;
            e[y][rev].val+=a;
            low-=a;
            totflow+=a;
            if(low==0)return totflow;
        }
    }
    if(low!=0)d[x]=-1;
    return totflow;
}

int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		for(int i=1;i<=40;i++)
		e[i].clear();
		
		int cnt=0,tot=0,sum=0;
		scanf("%d%d",&n,&m);
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				cin>>a[i][j];
				id[i][j]=++cnt;
				if(a[i][j]=='.')tot++;
			}
		}
		s=0;
		t=cnt+1;
		if(tot%2==1||tot<=2)
		{
			printf("NO\n");
			continue;
		}
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				if(i+j%2==1)
				{
					if(a[i][j]!='#')
					{
						add(s,id[i][j],2);
						sum+=2;
						for(int k=1;k<=4;k++)
						{
							int nx=i+gx[k];
							int ny=j+gy[k];
							if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&a[nx][ny]!='#')
								add(id[i][j],id[nx][ny],1);
						}
					}
				}
				else
				{
					add(id[i][j],t,2);
				}
			}
		}
		ans=0;
		while(bfs())
		ans+=dfs(s,inf);
		if(ans==sum)
		{
			printf("YES\n");
		}
		else
		printf("NO\n");
	}
	return 0;
} 
2019/4/5 19:33
加载中...