蒟蒻求条P3489 80pts 悬关
  • 板块灌水区
  • 楼主a_small_penguin
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/19 21:32
  • 上次更新2024/10/19 23:18:12
查看原帖
蒟蒻求条P3489 80pts 悬关
767155
a_small_penguin楼主2024/10/19 21:32

题目链接

code:

#include <bits/stdc++.h>

using namespace std;

typedef pair<pair<int, int> , vector<int>> PII;
typedef pair<int, int> PIII;

constexpr int N = 3009;

int n, m,p,k;
vector<PII> g[N];
int dist[N];
bool st[N];
vector<int> a[N]; 
bitset<19> q;

void dijkstra(int Start) {
    memset(dist, 0x3f, sizeof(dist));
    memset(st, false, sizeof(st));
    dist[Start] = 0;
    priority_queue<PIII, vector<PIII>, greater<PIII>> heap;
    heap.push(make_pair(0, Start));

    while (!heap.empty()) {
        auto t = heap.top();
        heap.pop();
        int ver = t.second, distance = t.first;
       	for(auto it:a[ver]) q[it] = 1;
        if (st[ver]) continue;
        st[ver] = true;
        for (const auto &it : g[ver]) {
            int to = it.first.first, val = it.first.second;
            vector<int> ccc = it.second;
            bool c = 1;
            for(auto ti : ccc){
            	c  &= q[ti];
			}
			if(!c) continue;
            if (dist[to] > dist[ver] + val) {
                dist[to] = dist[ver] + val;
                heap.push(make_pair(dist[to], to));
            }
        }
    }
}

int main() {
    cin >> n >> m >> p >> k;
    for(int i = 1;i<=k;i++){
    	int x,zzz;
    	cin >> x >> zzz;
    	for(int j = 1;j<=zzz;j++){
    		int y;
    		cin >> y;
    		a[x].push_back(y);
		}
	}
    for (int i = 0; i < m; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        vector<int> ccc;
        int c;
        cin >> c;
        for(int j = 0;j<c;j++){
        	int x;
        	cin >> x;
        	ccc.push_back(x);
		}
        g[u].push_back({{v,w},ccc});
        g[v].push_back({{u,w},ccc});
    }

    dijkstra(1);

    if (dist[n] == 0x3f3f3f3f) {
        cout << "-1\n";
    } else {
        cout << dist[n] << "\n";
    }
    return 0;
}
2024/10/19 21:32
加载中...