ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

「网络流 24 题」孤岛营救问题

2019-06-08 21:00:25  阅读:250  来源: 互联网

标签:24 y2 int d% x2 孤岛 y1 include 营救


设状态$(x,y,h)$为 到点$(x,y)$当前钥匙集合为$h$的最短用时, $bfs$求出最短路即可.

 

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <set>
#include <map>
#include <queue>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define PER(i,a,n) for(int i=n;i>=a;--i)
using namespace std;
typedef tuple<int,int,int,int> t4;
typedef tuple<int,int,int> t3;

const int dx[]={0,0,-1,1};
const int dy[]={-1,1,0,0};
int n, m, p, k, s;
map<t4,int> f;
set<t3> vis;
map<t3,int> dis;
int a[20][20];
queue<t3> q;

int main() {
	scanf("%d%d%d%d", &n, &m, &p, &k);
	REP(i,1,k) {
		int x1,y1,x2,y2,g;
		scanf("%d%d%d%d%d", &x1,&y1,&x2,&y2,&g);
		f[t4(x2,y2,x1,y1)] = f[t4(x1,y1,x2,y2)] = g?1<<g-1:1<<p;
	}
	scanf("%d", &s);
	REP(i,1,s) {
		int x,y,q;
		scanf("%d%d%d",&x,&y,&q);
		a[x][y] |= 1<<q-1;
	}
	q.push(t3(1,1,a[1][1]));
	dis[q.front()] = 0;
	vis.insert(q.front());
	int ans = 1e9;
	while (q.size()) {
		t3 u = q.front(); q.pop();
		int x,y,h;
		tie(x,y,h) = u;
		if (x==n&&y==m) ans = min(ans, dis[u]);
		REP(i,0,3) {
			int xx=x+dx[i],yy=y+dy[i];
			if (1<=xx&&xx<=n&&1<=yy&&yy<=m) {
				t3 v(xx,yy,h|a[xx][yy]);
				if (vis.count(v)) continue;
				int t = f[t4(x,y,xx,yy)];
				if ((h|t)==h) {
					dis[v] = dis[u]+1;
					vis.insert(v);
					q.push(v);
				}
			}
		}
	}
	printf("%d\n",ans==1e9?-1:ans);
}

 

标签:24,y2,int,d%,x2,孤岛,y1,include,营救
来源: https://www.cnblogs.com/uid001/p/10991677.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有