#6 RE 求调
查看原帖
#6 RE 求调
632311
huyangmu楼主2024/11/27 22:38

#include <bits/stdc++.h>
#define int long long 
using namespace std;
const int N = 1e5 + 5;
const int K = (1 << 17) + 5;
const int M = 22;
int n, m, k, x, y, c[M], dis[N][M], dp[M][K], ans = LONG_LONG_MAX;
bool vis[N];
struct Node{
	int v, w;
	bool operator < (const Node &a) const{
		return w > a.w;
	}
};
vector<Node> G[N];
map<int, int> mp;
void dijkstra (int x, int mid){
	for (int i = 1; i <= 100000; ++i){
		vis[i] = 0;
		dis[i][mid] = 0x3f3f3f3f3f3f3f3f;
	}
	dis[x][mid] = 0;
	priority_queue<Node> q;
	q.push(Node{x, 0});
	while (!q.empty()){
		int tmp = q.top().v;
		q.pop();
		if (vis[tmp]) continue;
		vis[tmp] = 1;
		for (int i = 0; i < G[tmp].size(); ++i){
			int x = G[tmp][i].v, y = G[tmp][i].w;
			if (dis[x][mid] > dis[tmp][mid] + y){
				dis[x][mid] = dis[tmp][mid] + y;
				q.push(Node{x, dis[x][mid]});
			}
		}
	}
}
signed main (){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin >> n >> m;
	for (int i = 1; i <= m; ++i){
		cin >> x >> y;
		G[x].push_back(Node{y, 1});
		G[y].push_back(Node{x, 1});
	}
	cin >> k;
	for (int i = 1; i <= k; ++i){
		cin >> c[i];
		dijkstra(c[i], i);
	}
	memset(dp, 0x3f, sizeof(dp));
	for (int i = 1; i <= k; ++i) dp[i][(1 << (k - i))] = 1;
	for (int i = 1; i <= k; ++i){
		for (int len = 2; len <= k; ++len){
			for (int j = 1; j <= (1 << k) - 1; ++j){
				int pos = j, tmp = 0, lena = 0, lenb = 0;
				vector<int> vec;
				while (pos > 0){
					if (pos % 2) lenb += 1;
					vec.push_back(pos % 2);
					pos /= 2;
					lena += 1;
				}
				vec.push_back(0);				 
				if (lenb != len) continue;
				lena += 1;
				reverse(vec.begin(), vec.end());
				if (vec[i] == 0) continue;
				tmp = j - (1ll << (lena - i - 1));
				for (int l = 1; l <= k; ++l){
					if (l == i || vec[l] == 0 || dis[c[i]][l] > 1e18) continue;
					dp[i][j] = min(dp[i][j], dp[l][tmp] + dis[c[i]][l]);
				}
			}
		}
	}
	for (int i = 1; i <= k; ++i) ans = min(ans, dp[i][(1 << k) - 1]);
	cout << ((ans > 1e18) ? -1 : ans) << '\n';
	return 0;
}
2024/11/27 22:38
加载中...