博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3057 Evacuation 二分图匹配
阅读量:5817 次
发布时间:2019-06-18

本文共 2230 字,大约阅读时间需要 7 分钟。

每个门每个时间只能出一个人,那就把每个门拆成多个,对应每个时间。

不断增加时间,然后增广,直到最大匹配。

//#pragma comment(linker, "/STACK:1024000000,1024000000")#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;typedef unsigned long long ull;typedef pair
pii;#define pb(a) push(a)#define INF 0x1f1f1f1f#define lson idx<<1,l,mid#define rson idx<<1|1,mid+1,r#define PI 3.1415926535898template
T min(const T& a,const T& b,const T& c){ return min(min(a,b),min(a,c));}template
T max(const T& a,const T& b,const T& c){ return max(max(a,b),max(a,c));}void debug(){#ifdef ONLINE_JUDGE#else freopen("data.in","r",stdin); // freopen("d:\\out1.txt","w",stdout);#endif}int getch(){ int ch; while((ch=getchar())!=EOF) { if(ch!=' '&&ch!='\n')return ch; } return EOF;}int DX[] = { 0, 1, 0, -1};int DY[] = { 1, 0, -1, 0};const int maxn = 15;char grid[maxn][maxn];int n, m;int dist[maxn][maxn][maxn][maxn];int vis[maxn][maxn];vector
dx,dy,px,py;void bfs(int X,int Y){ queue
qx,qy; qx.push(X); qy.push(Y); memset(vis, 0, sizeof(vis)); vis[X][Y] = true; while(!qx.empty()) { int x = qx.front(); qx.pop(); int y = qy.front(); qy.pop(); for(int d=0; d<4; d++) { int nx = x + DX[d]; int ny = y + DY[d]; if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&grid[nx][ny]=='.'&&!vis[nx][ny]) { vis[nx][ny] = true; dist[X][Y][nx][ny] = dist[X][Y][x][y] + 1; qx.push(nx); qy.push(ny); } } }}void prework(){ memset(dist, -1, sizeof(dist)); dx.clear(); dy.clear(); px.clear(); py.clear(); for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) { if(grid[i][j]=='D') { dx.push_back(i); dy.push_back(j); dist[i][j][i][j]=0; bfs(i, j); }else if(grid[i][j]=='.') { px.push_back(i); py.push_back(j); } } //printf("prework: %d %d\n",dx.size(), px.size());}const int maxv = 101*50 + 110;int id[maxn][maxn][110];bool used[maxv];int match[maxv];int vcnt;vector
g[maxv];int ID(int x, int y, int t){ int &a = id[x][y][t]; if(a==0) a=++vcnt; return a;}void add(int u,int v){ g[u].push_back(v); g[v].push_back(u);}void init(){ for(int i=1; i
View Code

 

转载于:https://www.cnblogs.com/BMan/p/3713675.html

你可能感兴趣的文章
基本概念复习
查看>>
重构第10天:提取方法(Extract Method)
查看>>
Android Fragment使用(四) Toolbar使用及Fragment中的Toolbar处理
查看>>
解决pycharm在ubuntu下搜狗输入法一直固定在左下角的问题
查看>>
“Info.plist” couldn’t be removed
查看>>
多线程day01
查看>>
react-native 模仿原生 实现下拉刷新/上拉加载更多(RefreshListView)
查看>>
MySQL出现Access denied for user ‘root’@’localhost’ (using password:YES)
查看>>
通过Roslyn构建自己的C#脚本(更新版)(转)
查看>>
红黑树
查看>>
UIImagePickerController拍照与摄像
查看>>
python调用windows api
查看>>
Linux内核中的printf实现【转】
查看>>
第四章 mybatis批量insert
查看>>
Java并发框架——什么是AQS框架
查看>>
【数据库】
查看>>
Win配置Apache+mod_wsgi+django环境+域名
查看>>
第四届中国汽车产业信息化技术创新峰会将于6月在沪召开
查看>>
linux清除文件内容
查看>>
WindowManager.LayoutParams 详解
查看>>