超时了40分,求调
查看原帖
超时了40分,求调
819682
Exile_Code楼主2024/3/27 13:05
#define  _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include <vector>
#include <set>
#include <map>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cstdlib>
#include <algorithm>
#include <list>
#include <string>
#include <cmath>
#include <bitset>
#include <stack>
#include <math.h>
#include <functional>
#define ull             unsigned long long 
#define ll              long long 
#define pii             pair<ll ,ll>
#define cy              cout<<"YES"<<'\n'
#define cn              cout<<"NO"<<'\n'
#define forn(i,begin,end,add)	for(ll (i)=(begin);(i)<=(end);(i)+=(add))	//begin是i的起始,end是i的终止,add是每次加的大小
#define rforn(i,begin,end,sub)  for(ll (i)=(end);(i)>=(begin);(i)-=(sub))	//r是倒序遍历
#define vv              vector
#define inf32           INT32_MAX/2
#define inf64           INT64_MAX/2
#define LD              double
#define PI              acos(-1)
#define debug(a,b)		cout<<a<<b
#define eps				1e-12
const int N = 4e5 + 100;
const int mod = 998244353;
ll T;

vv<vv<pii>>tree;
int n, m;
int b;
void  dj(int s, vv<ll>& d) {

    priority_queue<pii>q;
    vv<int>vis(d.size());

    d[s] = 0; q.push({ 0,s });
    int cnt = 0;
    while (q.size()) {
        auto t = q.top();
        q.pop();
        int u = t.second;
        if (vis[u])continue;

        vis[u] = 1;
        for (auto ed : tree[u]) {
            int v = ed.first, w = ed.second;
            if (d[v] > d[u] + w) {
                d[v] = d[u] + w;
                q.push({ -d[v],v });
            }
        }
    }
}

void solve() {


    cin >> n;
    int k;
    int m; cin >> m; cin >> k;


    tree.clear();
    tree.resize(n + 1);
    forn(i, 1, m, 1) {
        int a, b; cin >> a >> b;
        int w; cin >> w;
        tree[a].push_back({ b,w });
        //tree[b].push_back({ a,w });
    }

    vv<int>use(k);
    forn(i, 0, k - 1, 1)
        cin >> use[i];

    sort(use.begin(), use.end());
    ll flag = 1;
    ll ans = inf64;

    while (1) {
        if (flag > use.back()) {
            break;
        }
        vv<int>u1;
        vv<int>u2;
        for (auto a : use) {
            if (a & flag)
                u1.push_back(a);
            else
                u2.push_back(a);
        }
        if (!u1.size() || !u2.size())
            continue;

        forn(i, 0, (int)u1.size() - 1 - 1, 1) {
            tree[u1[i]].push_back({ u1[i + 1],0 });
            tree[u1[i + 1]].push_back({ u1[i],0 });
        }

        forn(i, 0, (int)u2.size() - 1 - 1, 1) {
            tree[u2[i]].push_back({ u2[i + 1],0 });
            tree[u2[i + 1]].push_back({ u2[i],0 });
        }

        vv<ll>d(n + 1, inf64);

        for (auto a : u1)
            if (d[a] == inf64)
                dj(a, d);

        for (auto a : u2)
            ans = min(ans, d[a]);

        d = vv<ll>(n + 1, inf64);
        for (auto a : u2)
            if (d[a] == inf64)
                dj(a, d);

        for (auto a : u1)
            ans = min(ans, d[a]);

        forn(i, 0, (int)u1.size() - 1 - 1, 1) {
            tree[u1[i]].pop_back();
            tree[u1[i + 1]].pop_back();
        }

        forn(i, 0, (int)u2.size() - 1 - 1, 1) {
            tree[u2[i]].pop_back();
            tree[u2[i + 1]].pop_back();
        }

        flag <<= 1;
    }
    cout << ans << endl;
}
int main() {
    
    std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    T = 1;
    cin >> T;
    while (T--)
        solve();
    return 0;

}
2024/3/27 13:05
加载中...