测试点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