TLE on #10求助
查看原帖
TLE on #10求助
362101
_TLEer_的小号楼主2021/7/13 19:02

Rt.Thks.

code:

#include <iostream>
#include <queue>
#include <cstring>
#define INF 0x3f3f3f3f
using namespace std;
inline int read()
{
   int x = 0, f = 1;
   char c = getchar();
   while (c < '0' || c > '9')
   {
      if (c == '-')
         f = -1;
      c = getchar();
   }
   while (c >= '0' && c <= '9')
   {
      x = x * 10 + c - '0';
      c = getchar();
   }
   return x * f;
}
int n, m, s, lnsz, head[500010], size_hr[500010], size_rn[500010], size_dr[500010];
int cg[500010];
struct cmp_hr
{
   bool operator()(int a, int b) const
   {
      return size_hr[a] > size_hr[b];
   }
};
struct cmp_rn
{
   bool operator()(int a, int b) const
   {
      return size_rn[a] > size_rn[b];
   }
};
struct cmp_dr
{
   bool operator()(int a, int b) const
   {
      return size_dr[a] > size_dr[b];
   }
};
priority_queue<int, vector<int>, cmp_hr> q_hr;
priority_queue<int, vector<int>, cmp_rn> q_rn;
priority_queue<int, vector<int>, cmp_rn> q_dr;
int goed[500010];
struct ln
{
   int u, v, sz, nxt;
} a[1000010];
inline void mrg(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;
}
inline void dij(int start, int qq)
{
   q_hr.push(start);
   q_rn.push(start);
   q_dr.push(qq);
   size_hr[start] = 0;
   size_rn[start] = 0;
   size_dr[qq] = 0;
   register int t, v;
   while (!q_hr.empty())
   {
      t = q_hr.top();
      q_hr.pop();
      goed[t] = false;
      for (register int i = head[t]; i; i = a[i].nxt)
      {
         v = a[i].v;
         if (size_hr[v] > size_hr[t] + a[i].sz)
         {
            size_hr[v] = size_hr[t] + a[i].sz;
            if (!goed[v])
            {
               goed[v] = true;
               q_hr.push(v);
            }
         }
      }
   }

   while (!q_rn.empty())
   {
      t = q_rn.top();
      q_rn.pop();
      goed[t] = false;
      for (register int i = head[t]; i; i = a[i].nxt)
      {
         v = a[i].v;
         if (!cg[v])
            continue;
         if (size_rn[v] > size_rn[t] + a[i].sz)
         {
            size_rn[v] = size_rn[t] + a[i].sz;
            if (!goed[v])
            {
               goed[v] = true;
               q_rn.push(v);
            }
         }
      }
   }

   while (!q_dr.empty())
   {
      t = q_dr.top();
      q_dr.pop();
      goed[t] = false;
      for (register int i = head[t]; i; i = a[i].nxt)
      {
         v = a[i].v;
         if (size_dr[v] > size_dr[t] + a[i].sz)
         {
            size_dr[v] = size_dr[t] + a[i].sz;
            if (!goed[v])
            {
               goed[v] = true;
               q_dr.push(v);
            }
         }
      }
   }
}
inline void print(int k)
{
   char ch[20];
   int num = 0;
   while (k > 0)
      ch[++num] = k % 10, k /= 10;
   while (num)
      putchar(ch[num--] + 48);
   putchar(32);
}
signed main()
{
   int u, v, w, k;
   ios::sync_with_stdio(false);
   cin.tie(0);
   cout.tie(0);
   n = read();
   m = read();
   k = read();
   s = 1;
   memset(cg, true, sizeof(cg));
   for (int i = 0; i < k; ++i)
      cg[(read())] = false;
   for (register int i = 0; i < m; ++i)
   {
      (u = read()), (v = read()), (w = read());
      mrg(u, v, w);
      mrg(v, u, w);
   }
   for (register int i = 0; i <= n; ++i)
      size_hr[i] = size_rn[i] = size_dr[i] = INF;
   int x, y;

   x = read();
   y = read();
   dij(s, x);
   print(min(min(max(size_hr[x], size_rn[y]), max(size_rn[x], size_hr[y])), min(size_hr[x], size_hr[y]) + size_dr[y]));
   puts("");
   return 0;
}

2021/7/13 19:02
加载中...