Problem p01003 (C++) — buggy submission, verdict: Runtime Error

// #include<iostream>
// #include<map>
// #include<algorithm>
// #include<queue>
// #include<vector>

// using namespace std;

// typedef pair<int,int> P;
// typedef pair<int,P> P2;

// int n,m,l,k;
// int u,v,c;
// int s,g,t;
// int b[7];

// int dis[51][1<<7][10],vis[51][1<<7];
// vector<P> G[51];
// const int INF = 100000000;

// int main(){
//   while(cin >> n >> m >> l >> k,n+m+l+k){
//     for(int i=1;i<=n;i++)G[i].clear();
//     for(int i=0;i<m;i++){
//       cin >> u >> v >> c;
//       G[u].push_back(P(c,v));
//       G[v].push_back(P(c,u));
//     }
//     cin >> s >> g;
//     for(int i=0;i<l;i++)cin >> b[i];

//     for(int i=1;i<=n;i++)
//       for(int j=0;j<(1<<l);j++){
//     for(int x=0;x<k;x++)dis[i][j][x] = INF;
//     vis[i][j] = 0;
//       }

//     int st = 0;
//     for(int i=0;i<l;i++)if(s==b[i])st |= 1<<i;

//     priority_queue< P2,vector<P2>,greater<P2> > q;
//     q.push(P2(0,P(s,st)));

//     while(q.size()){
//       P2 p = q.top(); q.pop();
//       int dist = p.first, pos = p.second.first, state = p.second.second;

//       if(vis[pos][state] < k){
//     dis[pos][state][vis[pos][state]] = dist;
//     vis[pos][state]++;
//     if(pos==g && state==(1<<l)-1 && vis[pos][state]==k)break;
//       }else continue;

//       for(int i=0;i<G[pos].size();i++){
//     int cost = G[pos][i].first, nxt = G[pos][i].second;
//     int nstate = state;
//     for(int j=0;j<l;j++)if(nxt==b[j])nstate |= 1<<j;

//     if(vis[nxt][nstate] < k)q.push(P2(dist+cost,P(nxt,nstate)));
//       }
//     }
//     int res = dis[g][(1<<l)-1][k-1];
//     if(res==INF)cout << "NA\\n";
//     else cout << res << endl;
//   }
// }

#include <algorithm>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <vector>

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;

int N, M, L, K;
int s, t;
vector<pii> G[51];
int d[11][51][1 << 7];
int poses[11];
int id[111];

const int INF = 1 << 29;

int dijkstra() {
  for (int k = 0; k < K; k++)
    for (int i = 0; i < N; i++)
      for (int j = 0; j < (1 << L); j++)
        d[k][i][j] = INF;
  priority_queue<pair<int, pii>, vector<pair<int, pii>>,
                 greater<pair<int, pii>>>
      pq;
  int initMask = 0;
  if (id[s] != -1)
    initMask |= (1 << id[s]);
  pq.push(make_pair(0, pii(s, initMask)));
  d[0][s][initMask] = 0;
  while (pq.size()) {
    pair<int, pii> p = pq.top();
    pq.pop();
    const int ccost = p.first;
    const int cnode = p.second.first;
    const int cmask = p.second.second;
    if (ccost > d[K - 1][cnode][cmask])
      continue;
    for (int i = 0; i < (int)G[cnode].size(); i++) {
      int ncost = G[cnode][i].second + ccost;
      const int nnode = G[cnode][i].first;
      int nmask = cmask;
      const int x = id[nnode];
      if (x != -1)
        nmask |= (1 << x);
      bool isUpdate = false;
      ll tmp = ncost;
      // 0番目からK-1番目まで順番に更新していく
      for (int j = 0; j < K; j++) {
        if (d[j][nnode][nmask] >= ncost) {
          isUpdate = true;
          swap(d[j][nnode][nmask], ncost);
        }
      }
      if (isUpdate)
        pq.push(make_pair(tmp, pii(nnode, nmask)));
    }
  }
  return d[K - 1][t][(1 << L) - 1];
}

int main() {
  while (cin >> N >> M >> L >> K && (N | M | L | K)) {
    for (int i = 0; i < N; i++)
      G[i].clear();
    for (int i = 0; i < M; i++) {
      int a, b, c;
      cin >> a >> b >> c;
      a--;
      b--;
      G[a].push_back(pii(b, c));
      G[b].push_back(pii(a, c));
    }
    cin >> s >> t;
    s--;
    t--;
    memset(id, -1, sizeof(id));
    for (int i = 0; i < L; i++) {
      cin >> poses[i];
      poses[i]--;
      id[poses[i]] = i;
    }
    int res = dijkstra();
    if (res == INF)
      cout << "NA" << endl;
    else
      cout << res << endl;
  }
  return 0;
}

// int main(){
//   bool flg=false;
//   while(cin>>N>>M>>L>>K&&(N|M|L|K)){
//     if(N==34)flg=true;
//     if(flg)
//       cerr<<N<<" "<<M<<" "<<L<<" "<<K<<endl;
//     for(int i=0;i<N;i++)G[i].clear();
//     for(int i=0;i<M;i++){
//       int a,b,c;
//       cin>>a>>b>>c;
//       if(flg)
//         cerr<<a<<" "<<b<<" "<<c<<" ";
//       a--;b--;
//       G[a].push_back(pii(b,c));
//       G[b].push_back(pii(a,c));
//     }
//     if(flg)
//       cerr<<endl;
//     cin>>s>>t;
//     if(flg)
//       cerr<<s<<" "<<t<<endl;
//     s--;t--;
//     memset(id,-1,sizeof(id));
//     for(int i=0;i<L;i++){
//       cin>>poses[i];
//       if(flg)
//         cerr<<poses[i]<<endl;
//       poses[i]--;
//       id[poses[i]]=i;
//     }
//     int res=dijkstra();
//     // if(res==INF)cout<<"NA"<<endl;
//     // else cout<<res<<endl;
//   }
//   return 0;
// }

Error: WA

Fixed submission:

#include <algorithm>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <vector>

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;

int N, M, L, K;
int s, t;
vector<pii> G[51];
int d[11][51][1 << 7];
int poses[11];
int id[111];

const int INF = 1 << 29;

int dijkstra() {
  for (int k = 0; k < K; k++)
    for (int i = 0; i < N; i++)
      for (int j = 0; j < (1 << L); j++)
        d[k][i][j] = INF;
  priority_queue<pair<int, pii>, vector<pair<int, pii>>,
                 greater<pair<int, pii>>>
      pq;
  int initMask = 0;
  if (id[s] != -1)
    initMask |= (1 << id[s]);
  pq.push(make_pair(0, pii(s, initMask)));
  d[0][s][initMask] = 0;
  while (pq.size()) {
    pair<int, pii> p = pq.top();
    pq.pop();
    const int ccost = p.first;
    const int cnode = p.second.first;
    const int cmask = p.second.second;
    if (ccost > d[K - 1][cnode][cmask])
      continue;
    for (int i = 0; i < (int)G[cnode].size(); i++) {
      int ncost = G[cnode][i].second + ccost;
      const int nnode = G[cnode][i].first;
      int nmask = cmask;
      const int x = id[nnode];
      if (x != -1)
        nmask |= (1 << x);
      // 0番目からK-1番目まで順番に更新していく
      for (int j = 0; j < K; j++) {
        if (d[j][nnode][nmask] > ncost) {
          swap(d[j][nnode][nmask], ncost);
          pq.push(make_pair(d[j][nnode][nmask], pii(nnode, nmask)));
        }
      }
    }
  }
  return d[K - 1][t][(1 << L) - 1];
}

// int main(){
//   bool flg=false;
//   while(cin>>N>>M>>L>>K&&(N|M|L|K)){
//     //if(N==33)flg=true;
//     if(flg)
//       cerr<<N<<" "<<M<<" "<<L<<" "<<K<<endl;
//     for(int i=0;i<N;i++)G[i].clear();
//     for(int i=0;i<M;i++){
//       int a,b,c;
//       cin>>a>>b>>c;
//       if(flg)
//         cerr<<a<<" "<<b<<" "<<c<<" ";
//       a--;b--;
//       G[a].push_back(pii(b,c));
//       G[b].push_back(pii(a,c));
//     }
//     if(flg)
//       cerr<<endl;
//     cin>>s>>t;
//     if(flg)
//       cerr<<s<<" "<<t<<endl;
//     s--;t--;
//     memset(id,-1,sizeof(id));
//     for(int i=0;i<L;i++){
//       cin>>poses[i];
//       if(flg)
//         cerr<<poses[i]<<endl;
//       poses[i]--;
//       id[poses[i]]=i;
//     }
//     int res=dijkstra();
//     if(res==INF)cout<<"NA"<<endl;
//     else cout<<res<<endl;
//   }
//   return 0;
// }

int main() {
  bool flg = false;
  while (cin >> N >> M >> L >> K && (N | M | L | K)) {
    if (N == 34)
      flg = true;
    if (flg)
      cerr << N << " " << M << " " << L << " " << K << endl;
    for (int i = 0; i < N; i++)
      G[i].clear();
    for (int i = 0; i < M; i++) {
      int a, b, c;
      cin >> a >> b >> c;
      if (flg)
        cerr << a << " " << b << " " << c << " ";
      a--;
      b--;
      G[a].push_back(pii(b, c));
      G[b].push_back(pii(a, c));
    }
    if (flg)
      cerr << endl;
    cin >> s >> t;
    if (flg)
      cerr << s << " " << t << endl;
    s--;
    t--;
    memset(id, -1, sizeof(id));
    for (int i = 0; i < L; i++) {
      cin >> poses[i];
      if (flg)
        cerr << poses[i] << endl;
      poses[i]--;
      id[poses[i]] = i;
    }
    int res = dijkstra();
    // if(res==INF)cout<<"NA"<<endl;
    // else cout<<res<<endl;
  }
  return 0;
}