关于SPFA顺序的问题
查看原帖
关于SPFA顺序的问题
151723
legendgod楼主2020/10/26 20:57

RT

主程序中disdis中的顺序会影响答案

有没有大佬帮忙解答一下,蒟蒻百思不得其解

#include<bits/stdc++.h>
using namespace std;

const int maxn = (1 << 10) + 5;

inline void read(int &x); 
#define r1(x) read(x)

int n, m, D, ans = -0x3f3f3f3f, mmax;
int sum[maxn],v[20];
int f[20][20][maxn];
char c[20][20];
int ax[20],ay[20];
int vis[20][20][1<<11];

struct Node{
	int x,y,s;
	 Node(int aa=0,int bb=0,int cc=0){
        x=aa,y=bb,s=cc;
    }
};

int dis[4][2] = {{0,-1},{-1,0},{0,1},{1,0}};
//int xx[4] = {0,-1,0,1},yy[4] = {-1,0,1,0};
int solve(int mx,int my,int nx,int ny,int ms) {
	int ns(ms);
	for(int i = 1;i <= D; ++i) {
		if(((mx == ax[i] && nx < ax[i]) || (mx < ax[i] && nx == ax[i])) && ny > ay[i]) {
			ns ^= (1 << (i - 1));
		}
	}
	return ns;
}

void spfa(int x,int y) {
//	memset(vis,0,sizeof(vis));
	memset(f,0x3f,sizeof(f));
	f[x][y][0] = 0;
	queue<Node> q;
	q.push((Node){x,y,0});
	while(!q.empty()) {
		Node u = q.front();
		q.pop();
		int mx = u.x,my = u.y,ms = u.s;
		vis[mx][my][ms] = 0;
		for(int i = 0;i < 4; ++i) {
//			int nx = mx + xx[i],ny = my + yy[i];
			int nx = mx + dis[i][0], ny = my + dis[i][1];
			
			if(nx < 1 || ny < 1 || nx > n || ny > m || (c[nx][ny] >= '1' && c[nx][ny] <= '9') || c[mx][my] == '#') continue;
			int ns(ms);
			if(i & 1) ns = solve(mx,my,nx,ny,ns);
			if(f[mx][my][ms] < f[nx][ny][ns]) {
				f[nx][ny][ns] = f[mx][my][ms] + 1;
				if(!vis[nx][ny][ns]) {
					vis[nx][ny][ns] =1;
					q.push((Node){nx,ny,ns});
				}
			}
		}
	}
	for(int i = 0;i < mmax; ++i) {
		ans = max(ans,sum[i] - f[x][y][i]);
	}
}

int main() {
//	freopen("perfume.in","r",stdin);
//	freopen("perfume.out","w",stdout);
	int i, j;
	r1(n),r1(m),r1(D);
	mmax = 1 << D;
	for(i = 1;i <= D; ++i) {
		r1(v[i]);
	}
	 for(int i=0;i<mmax;i++){
        for(int j=1;j<=D;j++){
            if(i&(1<<(j-1))) sum[i]+=v[j];
        }
    }
//	for(i = 0;i < mmax;++i ) {
//		for(j = 1;j <= D; ++j) {
//			if((1 << (j - 1)) & i) sum[i] += v[j];	
//		}
//	}
	for(i = 1;i <= n; ++i) {
//		cin >> c[i];
//		scanf("%s",c[i]+1);
		cin >> (c[i] + 1);
	}
	for(i = 1;i <= n; ++i) {
		for(j = 1;j <= m; ++j) {
			if('0' < c[i][j] && c[i][j] <= '9') {
				int now = c[i][j] - '0';
				ax[now] = i,ay[now] = j;
			}
		}
	}
	for(i = 1;i <= n; ++i) {
		for(j = 1;j <= m; ++j) {
			if(c[i][j] == '0') {
				spfa(i,j);
			}
		}
	}
	for(i = 0;i < 4; ++i) 
	printf("%d %d\n",dis[i][0],dis[i][1]);
	printf("%d\n",ans);
	return 0;
}

inline void read(int &x) {
	char c = getchar();
	x = 0;
	int f = 1; 
	for(; !isdigit(c);c = getchar()) if(c == '-') f = -1;
	for(; isdigit(c);c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
//	f?x:-x;
	x *= f;
}
2020/10/26 20:57
加载中...