题意:给一个网格,每个格子有一个方向表示在这个格子上要往哪个方向走,你可以改变某些格子的方向,问最少多少次操作使得从任意格子出发都能回到这个格子

woc这都不会我还是回家种田去吧...

题目的要求是改变某些点的出边使得整个图变成许多环,注意到在满足要求的图中,每个点只有一条入边和一条出边,所以我们对每个格子建两个点代表它的出边和入边,相当于是要找到一组入边和出边的匹配,如果一个入边和出边匹配是原来的方向,那么费用为$0$,否则费用为$1$,跑最小费用最大流即可

#include<stdio.h>
#include<string>
#include<vector>
#include<queue>
#include<string.h>
using namespace std;
const int inf=2147483647;
int h[510],nex[3010],to[3010],cap[3010],cos[3010],M=1,S,T;
void ins(int a,int b,int c,int d){
	M++;
	to[M]=b;
	cap[M]=c;
	cos[M]=d;
	nex[M]=h[a];
	h[a]=M;
}
void add(int a,int b,int c,int d){
	ins(a,b,c,d);
	ins(b,a,0,-d);
}
int dis[510],n,sum,cost;
bool aug[510];
struct pr{
	int x,d;
	pr(int u=0){x=u;d=dis[u];}
}t;
bool operator<(pr a,pr b){return a.d>b.d;}
priority_queue<pr>q;
bool bfs(){
	int x,i;
	memset(dis,63,sizeof(dis));
	dis[T]=0;
	q.push(T);
	while(!q.empty()){
		t=q.top();
		q.pop();
		x=t.x;
		if(dis[x]!=t.d)continue;
		for(i=h[x];i;i=nex[i]){
			if(cap[i^1]&&dis[x]-cos[i]<dis[to[i]]){
				dis[to[i]]=dis[x]-cos[i];
				q.push(to[i]);
			}
		}
	}
	sum+=dis[S];
	for(x=1;x<=n;x++){
		for(i=h[x];i;i=nex[i])cos[i]+=dis[to[i]]-dis[x];
	}
	return dis[S]!=dis[0];
}
int dfs(int x,int f){
	if(f==0)return 0;
	if(x==T){
		cost+=f*sum;
		return f;
	}
	int us=0,i,t;
	aug[x]=1;
	for(i=h[x];i;i=nex[i]){
		if(!cos[i]&&cap[i]&&!aug[to[i]]){
			t=dfs(to[i],min(cap[i],f-us));
			cap[i]-=t;
			cap[i^1]+=t;
			us+=t;
			if(us==f)break;
		}
	}
	if(us==f)aug[x]=0;
	return us;
}
int costflow(){
	do{
		do{
			memset(aug,0,sizeof(aug));
		}while(dfs(S,inf));
	}while(bfs());
	return cost;
}
const int g[4][2]={{0,-1},{0,1},{-1,0},{1,0}};
int type(char c){
	if(c=='L')return 0;
	if(c=='R')return 1;
	if(c=='U')return 2;
	return 3;
}
class DirectionBoard{
	public:
		int getMinimum(vector<string>mp){
			int n,m,i,j,k,x,y,t;
			n=mp.size();
			m=mp[0].length();
			S=n*m*2+1;
			T=S+1;
			::n=T;
			for(i=0;i<n;i++){
				for(j=0;j<m;j++){
					add(S,i*m+j+1,1,0);
					t=type(mp[i][j]);
					for(k=0;k<4;k++){
						x=(i+g[k][0]+n)%n;
						y=(j+g[k][1]+m)%m;
						add(i*m+j+1,x*m+y+1+n*m,1,k!=t);
					}
					add(i*m+j+1+n*m,T,1,0);
				}
			}
			return costflow();
		}
};
/*
int main(){
	vector<string>vt;
	char s[20];
	DirectionBoard cl;
	while(~scanf("%s",s))vt.push_back(s);
	printf("%d",cl.getMinimum(vt));
}
*/

[TCO2013]DirectionBoard的更多相关文章

  1. [TCO2013]TrickyInequality

    $\newcommand{stirf}[2]{{{#1}\brack{#2}}}$$\newcommand{stirs}[2]{{{#1}\brace{#2}}}$题意:$\sum\limits_{i ...

  2. [TCO2013]Block3Checkers

    题意:一个网格上有一些障碍和$3$个在网格边界上的棋子,你要添加一些障碍使得没有两个棋子四连通,问最少添加多少个障碍 官方题解——一张图教你做人... 三个棋子将网格边界分成三段,添加障碍后网格中一定 ...

  3. [TCO2013]LitPanels

    题意:一个$n\times m$的无色网格,你可以在其中选择两个$x\times y$的子矩形并在其中将其中任意的格子涂上颜色,问最终能得到多少种不同的网格 做这题会用到一个概念叫包围盒(boundi ...

随机推荐

  1. kaggle比赛之悟

    一.模型与特征哪个重要? 参与Sberbank Russian Housing Market比赛,一开始使用sklearn的岭回归函数Ridge(),残差值一直是0.37左右,然后同样的特征又使用了X ...

  2. ACC026简要题解

    这场AGC是时间正好在NOI之前休养生息的日子里,果断选择了放弃(虽然也从没有用大号打过).在随便做完了前几题之后就踏上了去长沙的旅程.NOI系列比赛总是休闲无比,咕咕不断,竟然连开幕式都能咕,今天A ...

  3. dump_stack 实现分析【转】

    转自:http://kernel.meizu.com/2017/03/18-40-19-dump_stack.html 1 简介 说起 dump_stack() ,相信从事 Linux 内核或者驱动相 ...

  4. win7旗舰版64位缺失tbb.dll文件

    win7旗舰版64位缺失tbb.dll文件 https://zhidao.baidu.com/question/688589990330312804.html 到好的电脑中复制一个,黏贴到下同的路径下 ...

  5. MongoDB的安装配置、基本操作及Perl操作MongoDB

    MongoDB的安装配置.基本操作及Perl操作MongoDB http://www.myhack58.com/Article/60/63/2014/42353.htm

  6. c#中char、string转换为十六进制byte的浅析

    问题引出: string转换为byte(十六进制) static void Main(string[] args) { "; byte[] b = Encoding.Default.GetB ...

  7. [New learn] 手势

    1.简介 我们经常会在设备上查看图片等, 也会经常将图片通过手指的捏合打开来缩小和方法图片.这就是ios中的手势功能在起作用. 那么手势好像也是一种touch事件,那和UIResponder中定义的t ...

  8. Nginx集群配置与redis的session共享策略

    一.什么是Nginx? Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Ramb ...

  9. FineReport——JS二次开发(局部刷新)

    在FR中,可以通过在form表单设置多个报表模板,然后通过对某一模板刷新实现局部刷新的功能,在cpt模板中,由于只存在一个模板,所以无法实现局部刷新. 其实,最好的局部刷新办法是自定义一个页面,然后添 ...

  10. Linux下undefined reference to ‘pthread_create’问题解决 zz

    接触了Linux系统编程中的线程编程模块,可gcc sample.c(习惯把书上的sample代码写进sample.c文件中)出现“undefined reference to ‘pthread_cr ...