WA on #2,10求助
查看原帖
WA on #2,10求助
362101
_TLEer_的小号楼主2021/7/12 23:02

Rt./tt

code:

#include <iostream>
#include <queue>
#include <cstring>
#define int long long
#define INF 0x3f3f3f3f
using namespace std;
int n, m, s, lnsz, head[500010], dijkstra_hr[500010], dijkstra_rn[500010];
bool cg[500010];
struct cmp_hr
{
   bool operator()(int a, int b) const
   {
      return dijkstra_hr[a] > dijkstra_hr[b];
   }
};
struct cmp_rn
{
   bool operator()(int a, int b) const
   {
      return dijkstra_rn[a] > dijkstra_rn[b];
   }
};
priority_queue<int, vector<int>, cmp_hr> q_hr;
priority_queue<int, vector<int>, cmp_rn> q_rn;
bool goed[500010];
struct ln
{
   int u, v, sz, nxt;
} a[1000010];
void merge(int u, int v, int sz)
{
   a[++lnsz].u = u;
   a[lnsz].v = v;
   a[lnsz].sz = sz;
   a[lnsz].nxt = head[u];
   head[u] = lnsz;
}
void dij(int start)
{
   q_hr.push(start);
   q_rn.push(start);
   dijkstra_hr[start] = 0;
   dijkstra_rn[start] = 0;
   while (!q_hr.empty())
   {
      int t = q_hr.top();
      q_hr.pop();
      goed[t] = false;
      for (int i = head[t]; i; i = a[i].nxt)
      {
         int v = a[i].v;
         if (dijkstra_hr[v] > dijkstra_hr[t] + a[i].sz)
         {
            dijkstra_hr[v] = dijkstra_hr[t] + a[i].sz;
            if (!goed[v])
            {
               goed[v] = true;
               q_hr.push(v);
            }
         }
      }
   }
   memset(goed, false, sizeof(goed));
   while (!q_rn.empty())
   {
      int t = q_rn.top();
      q_rn.pop();
      goed[t] = false;
      for (int i = head[t]; i; i = a[i].nxt)
      {
         int v = a[i].v;
         if (!cg[v])
            continue;
         if (dijkstra_rn[v] > dijkstra_rn[t] + a[i].sz)
         {
            dijkstra_rn[v] = dijkstra_rn[t] + a[i].sz;
            if (!goed[v])
            {
               goed[v] = true;
               q_rn.push(v);
            }
         }
      }
   }
}
signed main()
{
   int u, v, w, k;
   cin >> n >> m >> k;
   s = 1;
   memset(cg, true, sizeof(cg));
   for (int i = 0; i < k; i++)
   {
      int tmp;
      cin >> tmp;
      cg[tmp] = false;
   }
   for (int i = 0; i < m; i++)
   {
      cin >> u >> v >> w;
      merge(u, v, w);
      merge(v, u, w);
   }
   for (int i = 0; i <= n; i++)
      dijkstra_hr[i] = dijkstra_rn[i] = INF;
   dij(s);
   int x, y;
   cin >> x >> y;
   cout << min(max(dijkstra_hr[x], dijkstra_rn[y]), max(dijkstra_rn[x], dijkstra_hr[y])) << endl;
   return 0;
}

2021/7/12 23:02
加载中...