Submission #183615


Source Code Expand

#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <fstream>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <sys/time.h>
#include <unordered_map>
#include <unordered_set>
#include <unistd.h>
#include <utility>
#include <vector>
using namespace std;
#define i64         int64_t
#define rep(i, n)   for(i64 i = 0; i < ((i64)(n)); ++i)
#define sz(v)       ((i64)((v).size()))
#define bit(n)      (((i64)1)<<((i64)(n)))
#define all(v)      (v).begin(), (v).end()

template <int POS, class TUPLE> void deploy(std::ostream &os, const TUPLE &tuple){}
template <int POS, class TUPLE, class H, class ...Ts> void deploy(std::ostream &os, const TUPLE &t){ os << (POS == 0 ? "" : ", ") << get<POS>(t); deploy<POS + 1, TUPLE, Ts...>(os, t); }
template <class ...Ts> std::ostream& operator<<(std::ostream &os, const std::tuple<Ts...> &t){ os << "("; deploy<0, std::tuple<Ts...>, Ts...>(os, t); os << ")"; return os; }
template <class T> std::ostream& operator<<(std::ostream &os, std::vector<T> &v){ int remain = v.size(); os << "{"; for(auto e: v) os << e << (--remain == 0 ? "" : ", "); os << "}"; return os; }
template <class T> std::ostream& operator<<(std::ostream &os, std::set<T> &v){ int remain = v.size(); os << "{"; for(auto e: v) os << e << (--remain == 0 ? "" : ", "); os << "}"; return os; }
template <class T> std::ostream& operator<<(std::ostream &os, std::queue<T> &q){ auto qq = q; os << "{"; for(; !qq.empty(); qq.pop()){ os << qq.front() << (qq.size() != 1 ? ", " : ""); } os << "}"; return os; }
template <class T> std::ostream& operator<<(std::ostream &os, std::priority_queue<T> &q){ auto qq = q; os << "{"; for(; !qq.empty(); qq.pop()){ os << qq.top() << (qq.size() != 1 ? ", " : ""); } os << "}"; return os; }
template <class T, class K> std::ostream& operator<<(std::ostream &os, std::pair<T, K> &p){ os << "(" << p.first << ", " << p.second << ")"; return os; }
template <class T, class K> std::ostream& operator<<(std::ostream &os, std::map<T, K> &mp){ int remain = mp.size(); os << "{"; for(auto e: mp) os << "(" << e.first << " -> " << e.second << ")" << (--remain == 0 ? "" : ", "); os << "}"; return os; }
template <class T, class K> std::ostream& operator<<(std::ostream &os, std::unordered_map<T, K> &mp){ int remain = mp.size(); os << "{"; for(auto e: mp) os << "(" << e.first << " -> " << e.second << ")" << (--remain == 0 ? "" : ", "); os << "}"; return os; }
#define DEBUG0() { char buf[100]; sprintf(buf, "line:%3d | ", __LINE__); std::cout << buf << std::endl; }
#define DEBUG1(var0) { char buf[100]; sprintf(buf, "line:%3d | ", __LINE__); std::cout << buf << (#var0) << "=" << (var0) << std::endl; }
#define DEBUG2(var0, var1) { char buf[100]; sprintf(buf, "line:%3d | ", __LINE__); std::cout << buf << (#var0) << "=" << (var0) << ", " << (#var1) << "=" << (var1) << std::endl; }
#define DEBUG3(var0, var1, var2) { char buf[100]; sprintf(buf, "line:%3d | ", __LINE__); std::cout << buf << (#var0) << "=" << (var0) << ", " << (#var1) << "=" << (var1) << ", " << (#var2) << "=" << (var2) << std::endl; }
#define DEBUG4(var0, var1, var2, var3) { char buf[100]; sprintf(buf, "line:%3d | ", __LINE__); std::cout << buf << (#var0) << "=" << (var0) << ", " << (#var1) << "=" << (var1) << ", " << (#var2) << "=" << (var2) << ", " << (#var3) << "=" << (var3) << std::endl; }
#define DEBUG5(var0, var1, var2, var3, var4) { char buf[100]; sprintf(buf, "line:%3d | ", __LINE__); std::cout << buf << (#var0) << "=" << (var0) << ", " << (#var1) << "=" << (var1) << ", " << (#var2) << "=" << (var2) << ", " << (#var3) << "=" << (var3) << ", " << (#var4) << "=" << (var4) << std::endl; }
#define DEBUG6(var0, var1, var2, var3, var4, var5) { char buf[100]; sprintf(buf, "line:%3d | ", __LINE__); std::cout << buf << (#var0) << "=" << (var0) << ", " << (#var1) << "=" << (var1) << ", " << (#var2) << "=" << (var2) << ", " << (#var3) << "=" << (var3) << ", " << (#var4) << "=" << (var4) << ", " << (#var5) << "=" << (var5) << std::endl; }
#define ASSERT(f) { if(!(f)){ DEBUG1("error"); while(true); }}



template <typename T> class Dijkstra
{
public:
  void addEdge(int from, int dest, T cost);
  void update(int source);
  T getDistance(int vertex);
  
  ~Dijkstra();
  Dijkstra(int vertex_num);
  
private:
  const int vertex_num;
  T *distances;
  
  class Edge
  {
  public:
    int target;
    T distance;
    Edge(int target, T distance) : target(target), distance(distance) {}
  };
  std::vector<Edge> *edges;
  
  class QueueElement
  {
  public:
    T distance;
    int vertex;
    inline QueueElement(T distance, int vertex) : distance(distance), vertex(vertex){}
    inline bool operator>(const QueueElement &e)const{ return distance > e.distance; }
  };
};

template <typename T>
inline Dijkstra<T>::~Dijkstra()
{
  delete [] edges;
  delete [] distances;
}

template <typename T>
inline Dijkstra<T>::Dijkstra(int vertex_num) : vertex_num(vertex_num)
{
  edges = new vector<Edge>[vertex_num];
  distances = new T[vertex_num];
}

template <typename T>
inline T Dijkstra<T>::getDistance(int vertex)
{
  return distances[vertex];
}

template <typename T>
inline void Dijkstra<T>::update(int source)
{
  memset(distances, -1, sizeof(T) * vertex_num);

  priority_queue<QueueElement, vector<QueueElement>, greater<QueueElement> > q;
  distances[source] = 0;
  q.push(QueueElement(0, source));
  
  for(int total_size = 1; 0 < total_size; q.pop()){
    int vertex = q.top().vertex;
    T distance = q.top().distance;
    if(distances[vertex] < distance) continue;
    --total_size;
    
    for(auto e : edges[vertex]){
      int next_vertex = e.target;
      T next_distance = e.distance + distance;
      if(distances[next_vertex] == -1){
        ++total_size;
        distances[next_vertex] = next_distance;
        q.push(QueueElement(next_distance, next_vertex));
      }else if(next_distance < distances[next_vertex]){
        distances[next_vertex] = next_distance;
        q.push(QueueElement(next_distance, next_vertex));
      }
    }
  }
}

template <typename T>
inline void Dijkstra<T>::addEdge(int from, int dest, T cost)
{
  edges[from].push_back(Edge(dest, cost));
}



int main()
{
  i64 n, m, r, t;
  cin >> n >> m >> r >> t;
  
  Dijkstra<i64> dijkstra(n);
  rep(i, m){
    i64 a, b, c;
    cin >> a >> b >> c; --a, --b;
    dijkstra.addEdge(a, b, c);
    dijkstra.addEdge(b, a, c);
  }
  
  i64 total = 0;
  rep(target, n){
    dijkstra.update(target);
    vector<i64> a;
    rep(i, n)if(target != i) a.push_back(dijkstra.getDistance(i));
    sort(all(a));
    i64 cur = 0;
    rep(i, sz(a)){
      while(cur < sz(a) && a[cur] * t <= a[i] * r) ++cur;
      total += sz(a) - cur - (cur <= i ? 1 : 0);
    }
  }
  cout << total << endl;
   
}






Submission Info

Submission Time
Task C - ウサギとカメ
User Komaki
Language C++11 (GCC 4.8.1)
Score 100
Code Size 6986 Byte
Status AC
Exec Time 1222 ms
Memory 1176 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 100 / 100
Status
AC × 2
AC × 18
Set Name Test Cases
Sample subtask0_sample-01.txt, subtask0_sample-02.txt
All subtask0_sample-01.txt, subtask0_sample-02.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask1_13.txt, subtask1_14.txt, subtask1_15.txt, subtask1_16.txt
Case Name Status Exec Time Memory
subtask0_sample-01.txt AC 110 ms 804 KB
subtask0_sample-02.txt AC 24 ms 908 KB
subtask1_01.txt AC 23 ms 848 KB
subtask1_02.txt AC 25 ms 860 KB
subtask1_03.txt AC 23 ms 920 KB
subtask1_04.txt AC 53 ms 788 KB
subtask1_05.txt AC 31 ms 880 KB
subtask1_06.txt AC 33 ms 884 KB
subtask1_07.txt AC 55 ms 1016 KB
subtask1_08.txt AC 64 ms 1012 KB
subtask1_09.txt AC 380 ms 924 KB
subtask1_10.txt AC 350 ms 976 KB
subtask1_11.txt AC 169 ms 1052 KB
subtask1_12.txt AC 1070 ms 1100 KB
subtask1_13.txt AC 1074 ms 1056 KB
subtask1_14.txt AC 1222 ms 1044 KB
subtask1_15.txt AC 812 ms 1132 KB
subtask1_16.txt AC 1194 ms 1176 KB