网络流24题-1  孤岛营救问题_IT

题目链接:https://www.luogu.com.cn/problem/P4011

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=21,M=1<<15;
 4 const int dx[11]={1,-1,0,0},dy[11]={0,0,1,-1};
 5 int n,m,p,T,S;
 6 int g[N][N][N][N],cnt[N][N],key[N][N][N];
 7 bool vis[N][N][M];
 8 
 9 struct Node {
10     int x,y,k,d;
11     Node() { x=y=k=d=0; }
12     Node(int _x,int _y,int _k,int _d) {
13         x=_x,y=_y,k=_k,d=_d;
14     }
15 };
16 
17 inline int re_ad() {
18     char ch=getchar(); int x=0,f=1;
19     while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
20     while('0'<=ch && ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
21     return x*f;
22 }
23 
24 int get_key(int x,int y) {
25     int res=0;
26     for(int i=1;i<=cnt[x][y];++i) res|=(1<<(key[x][y][i]-1));
27     return res;
28 }
29 
30 int bfs(int sx,int sy) {
31     queue<Node> q;
32     int sk=get_key(sx,sy);
33     q.push(Node{sx,sy,sk,0});
34     vis[sx][sy][sk]=true;
35     while(!q.empty()) {
36         Node u=q.front(); q.pop();
37         if(u.x==n && u.y==m) return u.d;
38         int ux=u.x,uy=u.y,uk=u.k,ud=u.d;
39         for(int i=0,vx,vy,vk,opt;i<4;++i) {
40             vx=ux+dx[i],vy=uy+dy[i],opt=g[ux][uy][vx][vy];
41             if(opt==-1) continue;
42             if(vx<1 || vx>n || vy<1 || vy>m) continue;
43             if(opt && !(uk&(1<<(opt-1)))) continue;
44             if(vx<1||vx>n||vy<1||vy>m||opt<0||(opt&&!(u.k&(1<<(opt-1))))) continue;
45             vk=uk|get_key(vx,vy);
46             if(!vis[vx][vy][vk]) q.push(Node{vx,vy,vk,ud+1}),vis[vx][vy][vk]=true;
47         }
48     }
49     return -1;
50 }
51 
52 int main()
53 {
54     n=re_ad(),m=re_ad(),p=re_ad(),T=re_ad();
55     for(int t=1,x,y,xx,yy,G;t<=T;++t) {
56         x=re_ad(),y=re_ad(),xx=re_ad(),yy=re_ad(),G=re_ad();
57         if(G) g[x][y][xx][yy]=g[xx][yy][x][y]=G;
58         else g[x][y][xx][yy]=g[xx][yy][x][y]=-1;
59     }
60     S=re_ad();
61     for(int s=1,x,y,q;s<=S;++s) {
62         x=re_ad(),y=re_ad(),q=re_ad();
63         key[x][y][++cnt[x][y]]=q;
64     }
65     printf("%d\n",bfs(1,1));
66     return 0;
67 }