代码 RE 了,但不知道在哪里出现问题了
查看原帖
代码 RE 了,但不知道在哪里出现问题了
358283
Crab_time楼主2023/7/24 14:48

代码如下:

#include<iostream>
#include<queue>
#include<cstring>
#include<assert.h>
using namespace std;

#define fl(i,a,b) for(int i = a;i<(b);i++)
#define fg(i,a,b) for(int i = a;i>(b);i--)
#define fle(i,a,b) for(int i = a;i<=(b);i++)
#define fge(i,a,b) for(int i = a;i>=(b);i--)
#define inf 0x3f3f3f3f
#define long_inf 0x3f3f3f3f3f3f3f3f
#define ll long long
#define fi first
#define se second
#define mp make_pair
#define maxk 17
#define maxm 400005

ll k,m,s;
ll a[maxk];
ll x[maxm << 1],y[maxm << 1],c[maxm << 1];
ll head[1<<maxk],ver[maxm << 1],edge[maxm << 1],nex[maxm << 1],d[maxm << 1];
bool v[1<<maxk];
ll n,tot;
priority_queue<pair<ll,ll>> q;

void add(ll b,ll e,ll z){
    ver[++tot] = e,edge[tot] = z,nex[tot] = head[b],head[b] = tot;
}

void dijkstra(ll start){
    memset(v,0,sizeof(v));
    d[start] = 0;
    q.push(mp(0,start));
    while (q.size())
    {
        ll j = q.top().se;q.pop();
        if(v[j]){continue;}
        v[j] = 1;
        for(ll i = head[j];i;i = nex[i]){
            ll e = ver[i],z = edge[i];
            if(d[e] > d[j] + z){
                d[e] = d[j] + z;
                q.push(mp(-d[e],e));
            }
        }
    }
}

int main()
{
    // freopen("P9377.in","r",stdin);
    // freopen("P9377.ans","w",stdout);
    cin >> k >> m >> s;
    fle(i,1,k){
        cin >> a[i];
    }
    fle(i,1,m){
        cin >> x[i] >> y[i] >> c[i];
        add(x[i],y[i],c[i]),add(y[i],x[i],c[i]);
    }
    for(ll i = 0;i <= (1<<k)-1;i++){
        for(ll j = 0;j <= (1<<k)-1;j++){
            ll cnt = 0;
            if(i == j){continue;}
            fl(k,0,18){
                if(((i >> k) & 1) != ((j >> k) & 1)){
                    cnt++;
                }
            }
            if(cnt < 1&&cnt > k){continue;}
            add(i,j,a[cnt]),add(j,i,a[cnt]);
        }
    }
    memset(d,0x3f,sizeof(d));
    dijkstra(s);
    for(ll i = 0;i < (1<<k);i++){
        cout << d[i] << " ";
    }
    return 0;
}
2023/7/24 14:48
加载中...