Submission #3563704
Source Code Expand
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int INF = 1e9;
const ll LINF = 1e18;
inline ll gcd(ll a, ll b) { return b ? gcd(b, a%b) : a; }
inline ll lcm(ll a, ll b) { return a / gcd(a, b)*b; }
template<class S,class T> ostream& operator << (ostream& out,const pair<S,T>& o){ out << "(" << o.first << "," << o.second << ")"; return out; }
template<class T> ostream& operator << (ostream& out,const vector<T> V){ for(int i = 0; i < V.size(); i++){ out << V[i]; if(i!=V.size()-1) out << " ";} return out; }
template<class T> ostream& operator << (ostream& out,const vector<vector<T> > Mat){ for(int i = 0; i < Mat.size(); i++) { if(i != 0) out << endl; out << Mat[i];} return out; }
template<class S,class T> ostream& operator << (ostream& out,const map<S,T> mp){ out << "{ "; for(auto it = mp.begin(); it != mp.end(); it++){ out << it->first << ":" << it->second; if(mp.size()-1 != distance(mp.begin(),it)) out << ", "; } out << " }"; return out; }
/*
<url:>
問題文============================================================
=================================================================
解説=============================================================
================================================================
*/
struct edge{
int u,v,cost;
edge(){}
edge(int u,int v,int cost):u(u),v(v),cost(cost){}
};
ll solve(){
ll res = 0;
int N,M,R,T; cin >> N >> M >> R >> T;
vector<vector<edge>> G(N);
for(int i = 0; i < M;i++){
int a,b,c; cin >> a >> b >> c;
a--; b--;
G[a].push_back(edge(a,b,c));
G[b].push_back(edge(b,a,c));
}
queue<int> q;
for(int A = 0; A < N;A++){
vector<int> dist(N,INF);
dist[A] = 0;
q.push(A);
while(q.size()){
int n = q.front(); q.pop();
for(auto& e:G[n]){
if(dist[e.v] > dist[e.u] + e.cost){
dist[e.v] = dist[e.u] + e.cost;
q.push(e.v);
}
}
}
vector<int> distT(N);
vector<int> distR(N);
for(int i = 0; i < N;i++){
distT[i] = dist[i] * R;
distR[i] = dist[i] * T;
}
// cout << A << endl;
// cout << distT << endl;
// cout << distR << endl;
auto distRR = distR;
sort(distR.begin(),distR.end());
for(int B = 0; B < N; B++){
if(A == B) continue;
ll V = distT[B];
ll P = N - (upper_bound(distR.begin(),distR.end(),V) - distR.begin());
if(V < distRR[B]) P--;
if(V < distRR[A]) P--;
res += P;
}
}
return res;
}
int main(void) {
cin.tie(0); ios_base::sync_with_stdio(false);
cout << solve() << endl;
return 0;
}
Submission Info
Submission Time |
|
Task |
C - ウサギとカメ |
User |
vjudge3 |
Language |
C++14 (GCC 5.4.1) |
Score |
100 |
Code Size |
2876 Byte |
Status |
AC |
Exec Time |
768 ms |
Memory |
512 KB |
Judge Result
Set Name |
Sample |
All |
Score / Max Score |
0 / 0 |
100 / 100 |
Status |
|
|
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 |
1 ms |
256 KB |
subtask0_sample-02.txt |
AC |
1 ms |
256 KB |
subtask1_01.txt |
AC |
1 ms |
256 KB |
subtask1_02.txt |
AC |
1 ms |
256 KB |
subtask1_03.txt |
AC |
1 ms |
256 KB |
subtask1_04.txt |
AC |
1 ms |
256 KB |
subtask1_05.txt |
AC |
4 ms |
256 KB |
subtask1_06.txt |
AC |
5 ms |
256 KB |
subtask1_07.txt |
AC |
19 ms |
384 KB |
subtask1_08.txt |
AC |
22 ms |
384 KB |
subtask1_09.txt |
AC |
182 ms |
384 KB |
subtask1_10.txt |
AC |
169 ms |
384 KB |
subtask1_11.txt |
AC |
75 ms |
384 KB |
subtask1_12.txt |
AC |
709 ms |
512 KB |
subtask1_13.txt |
AC |
719 ms |
512 KB |
subtask1_14.txt |
AC |
748 ms |
512 KB |
subtask1_15.txt |
AC |
410 ms |
512 KB |
subtask1_16.txt |
AC |
768 ms |
512 KB |