孤岛营救问题(最短路 状态压缩) 网络流24题
状态压缩,最短路
//http://www.cnblogs.com/IMGavin/
#include <iostream>
#include <stdio.h>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <vector>
#include <map>
#include <stack>
#include <set>
#include <bitset>
#include <algorithm>
using namespace std;
typedef long long LL;
#define gets(A) fgets(A, 1e8, stdin)
const int INF = 0x3F3F3F3F, N = 50, MOD = 1003, M = 1800;
const double EPS = 1e-6;
int f[N][N][N][N];
int key[N][N];
bool inq[N][N][M];
int dis[N][N][M];
int dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
struct node{
int x, y, st;
node(int x1, int y1, int st1){
x = x1;
y = y1;
st = st1;
}
};
bool check(int x1, int y1, int x2, int y2, int st){
if(f[x1][y1][x2][y2] == INF){
return true;
}
if(f[x1][y1][x2][y2] == -1){
return false;
}
if((1 << f[x1][y1][x2][y2]) & st){
return true;
}else{
return false;
}
}
int SPFA(int n, int m, int p){
memset(inq, 0, sizeof(inq));
memset(dis, 0x3F, sizeof(dis));
dis[1][1][0] = 0;
queue <node> q;
q.push(node(1, 1, 0));
while(!q.empty()){
node u = q.front();
q.pop();
inq[u.x][u.y][u.st] = 0;
for(int i = 0; i < 4; i++){
int x1 = u.x + dir[i][0];
int y1 = u.y + dir[i][1];
int st = u.st | key[x1][y1];
if(x1 > 0 && x1 <= n && y1 > 0 && y1 <= m && check(u.x, u.y, x1, y1, st)){
if(dis[x1][y1][st] > dis[u.x][u.y][u.st] + 1){
dis[x1][y1][st] = dis[u.x][u.y][u.st] + 1;
node v(x1, y1, st);
q.push(v);
inq[v.x][v.y][v.st] = 1;
}
}
}
}
int ans = INF;
for(int i = 0; i < (1 << p); i++){
ans = min(ans, dis[n][m][i]);
}
if(ans == INF){
ans = -1;
}
return ans;
}
int main(){
int n, m, p, k;
while(cin >> n >> m >> p){
int x1, y1, x2, y2, g;
memset(f, 0x3F, sizeof(f));
cin >> k;
while(k--){
cin >> x1 >> y1 >> x2 >> y2 >> g;
g--;
f[x2][y2][x1][y1] = f[x1][y1][x2][y2] = g;
}
memset(key, 0, sizeof(key));
cin >> k;
while(k--){
cin >> x1 >> y1 >> g;
g--;
key[x1][y1] |= (1 << g);
}
cout<<SPFA(n, m, p)<<endl;
}
return 0;
}

浙公网安备 33010602011771号