DFS大BUG
查看原帖
DFS大BUG
297831
idgg007楼主2022/7/21 22:25

测试点3:

8 7
1 2 3
2 3 3
3 4 3
4 5 3
5 6 3
6 7 3
7 8 3

输出:

48

编译器:GCC11.2.0 64bit code:

#include<iostream>
#include<vector>
#include<cstring>
#include<set>
#include<algorithm>
using namespace std;
int N, M, Ans = 0x3f3f3f3f;
int disEdge[20][20], minPosibleAns; //存路径
vector<int>visiteable[20];
vector<int>node;
vector<bool>visited;
vector<int>disCenter;
int dataConnect;
bool cmp(int a, int b) {
	return disEdge[dataConnect][a] < disEdge[dataConnect][b];
}
void DFS(int deepth, int beginNumber, int spend, int nodeBefore, int nextNodeBefore) {
	if (spend > Ans) {
		return;
	}
	if (deepth == N)
		Ans = min(Ans, spend);
	for (int i = nodeBefore; i < deepth; i++){
		if(spend + minPosibleAns * disCenter[node[i]] >= Ans)	return;
		for (int nextNode = nextNodeBefore, length = visiteable[node[i]].size();
			nextNode < length; nextNode++)
			if (!visited[visiteable[node[i]][nextNode]]) {
			node[deepth] = visiteable[node[i]][nextNode];
			minPosibleAns -= disEdge[node[deepth]][visiteable[node[deepth]][1]];
			visited[visiteable[node[i]][nextNode]] = 1;
			disCenter[visiteable[node[i]][nextNode]] = disCenter[node[i]] + 1;
			DFS(deepth + 1, beginNumber, spend + disCenter[node[i]]
				*disEdge[node[i]][visiteable[node[i]][nextNode]],i,nextNode+1);
			node[deepth] = 0;
			minPosibleAns += disEdge[node[deepth]][visiteable[node[deepth]][1]];
			visited[visiteable[node[i]][nextNode]] = 0;
		}
		nextNodeBefore=1;
	}
}
int main() {
	ios::sync_with_stdio(0), cin.tie(0);
	cin >> N >> M;
	memset(disEdge, 0x3f, sizeof(disEdge));
	node.assign(N + 1, 0);
	disCenter.assign(N + 1, 0);
	visited.assign(N + 1, 0);
	for (int i = 0; i <= N; i++)
		visiteable[i].push_back(0);
	for (int i = 1; i <= M; i++) {
		int a, b, dis;
		cin >> a >> b >> dis;
		if (disEdge[a][b] == 0x3f3f3f3f) {
			visiteable[a].push_back(b);
			visiteable[b].push_back(a);
		}
		disEdge[a][b] = min(dis, disEdge[a][b]);
		disEdge[b][a] = min(dis, disEdge[a][b]);
	}
	for (int i = 1; i <= N; i++) {
		dataConnect = i;
		sort(visiteable[i].begin() + 1, visiteable[i].end(), cmp);
		minPosibleAns += disEdge[i][visiteable[i][1]];
	}
	for (int i = 1; i <= N; i++) {
		minPosibleAns -= disEdge[i][visiteable[i][1]];
		visited[i] = 1;
		node[0] = i;
		disCenter[i] = 1;
		DFS(1, i, 0,0,1);
		visited[i] = 0;
		node[0] = 0;
		disCenter[i] = 0;
		minPosibleAns += disEdge[i][visiteable[i][1]];
	}
	cout << Ans;
	return 0;
}

本地结果:

48

luoguIDE结果:

84
2022/7/21 22:25
加载中...