建边疑问
查看原帖
建边疑问
389540
imfkwk楼主2021/2/17 00:37

在输入过程中建边。每次搜索之前输入过的点有没有高度大于 0 的,如果有,那么就建立双向边。这种方法可以减少循环次数而且保证边的建立是正确的。

然后,普通的建立到终点的边。

第二次输入的时候,建立起点到蜥蜴的边。

看起来不错,运起来出错。求助。

for (register int i = 1; i <= r; ++i) {
		for (register int j = 1; j <= c; ++j) {
			no[i][j] = ++num;
			
			char now;
			cin >> now;
			if (now < '1') continue;
			
			h[i][j] = now - '0';
			add(num, num + r * c, h[i][j]);
			
			for (register int ii = i - d; ii <= i - 1; ++ii) {
				for (register int jj = j - d; jj <= j + d; ++jj) {
					if (ii < 1 || jj < 1 || jj > c) continue;
					if (!h[ii][jj]) continue;
					add(num + r * c, no[ii][jj], inf);
					add(no[ii][jj] + r * c, num, inf);
				}
			}
			
			for (register int jj = 1; jj < j; ++jj) {
				if (h[i][jj]) {
					add(num + r * c, no[i][jj], inf);
					add(no[i][jj] + r * c, num, inf);
				}
			}
			
			if (i - d < 1 || i + d > r || j - d < 1 || j + d > c) {
				add(num + r * c, t, inf);
			}
		}
	}

/悲

2021/2/17 00:37
加载中...