Submission #625832

#TimeUsernameProblemLanguageResultExecution timeMemory
625832Abrar_Al_SamitRobot (JOI21_ho_t4)C++17
34 / 100
3078 ms42364 KiB
#include<bits/stdc++.h>
using namespace std;

const int MX = 2e5 + 5;
const long long INF = 1e18;

vector<int>g[MX/2];
int cost[MX], color[MX];
int edge[2][MX];
int edgeID[2][MX];
long long cont[MX];

void PlayGround() {
  int n, m;
  cin>>n>>m;

  for(int i=1; i<=m; ++i) {
    int u, v, c, p;
    scanf("%d%d%d%d", &u, &v, &c, &p);
    g[u].push_back(i);
    g[v].push_back(i);
    color[i] = c, cost[i] = p;
    edge[0][i] = u, edge[1][i] = v;

    edgeID[0][i] = g[u].size();
    edgeID[1][i] = g[v].size();
  }

  vector<vector<long long>>ans(n+1, vector<long long>()), sum(n+1, vector<long long>());
  vector<vector<bool>>vis(n+1, vector<bool>());

  for(int i=1; i<=n; ++i) {
    ans[i].resize(g[i].size()+1, INF);
    vis[i].resize(g[i].size()+1, false);
    sum[i].resize(g[i].size()+1, 0LL);
  }

  for(int i=1; i<=n; ++i) {
    for(int j=0; j<g[i].size(); ++j) {
      cont[color[g[i][j]]] += cost[g[i][j]];
    }
    for(int j=0; j<g[i].size(); ++j) {
      sum[i][j+1] = cont[color[g[i][j]]];
    }
    for(int j=0; j<g[i].size(); ++j) {
      cont[color[g[i][j]]] = 0;
    }
  }


  priority_queue<tuple<long long, int, int>>pq;
  pq.emplace(0, 1, 0);
  ans[1][0] = 0;

  while(!pq.empty()) {
    int v = get<1>(pq.top());
    int id = get<2>(pq.top());
    int nerfed = -1;
    if(id) nerfed = g[v][id-1];

    pq.pop();
    if(vis[v][id]) continue;
    vis[v][id] = 1;

    for(auto e : g[v]) {
      int to = edge[(edge[0][e]==v)][e];
      long long cur = cost[e] + ans[v][id];

      int nextID = edgeID[(edge[0][e]==v)][e];
      int curID = edgeID[(edge[0][e]!=v)][e];

      if(ans[to][nextID]>cur) {
        ans[to][nextID] = cur;
        pq.emplace(-cur, to, nextID);
      }
      cur = sum[v][curID] - cost[e] + ans[v][id];
      if(nerfed!=-1 && color[nerfed]==color[e]) cur -= cost[nerfed];
      if(ans[to][0]>cur) {
        ans[to][0] = cur;
        pq.emplace(-cur, to, 0);
      }
    }
  }



  long long best = INF;
  for(auto b : ans[n]) {
    best = min(b, best);
  }
  if(best==INF) best = -1;
  printf("%lld\n", best);
}
int main() {
  PlayGround();

  cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
  return 0;
}

Compilation message (stderr)

Main.cpp: In function 'void PlayGround()':
Main.cpp:39:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   39 |     for(int j=0; j<g[i].size(); ++j) {
      |                  ~^~~~~~~~~~~~
Main.cpp:42:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   42 |     for(int j=0; j<g[i].size(); ++j) {
      |                  ~^~~~~~~~~~~~
Main.cpp:45:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   45 |     for(int j=0; j<g[i].size(); ++j) {
      |                  ~^~~~~~~~~~~~
Main.cpp:19:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   19 |     scanf("%d%d%d%d", &u, &v, &c, &p);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...