Problem Info
Shortcut
Link: here
Question
I wonder why my code run all and failing on only test case 9, I don’t know what cause failing.
What I’ve Tried
First, I use dijkstra to find shortest path from 1 to all nodes.
While dijkstra-ing, I build a tree where 1 is the root node in order to find total cows after a node for each node. Then I calculate the maximum it can get. But failed in test case 9.
I also look at the test cases, but I don’t know why sum up cows using tree cause error. It’s overflow? And if it’s, how to fix it?
I’d appreciated if some could help me.
Here is my code:
#include <bits/stdc++.h>
using namespace std;
typedef pair<long long, long long> ll;
const int MAX_N = 10000;
long long n, m, t;
long long cows[MAX_N];
vector<ll> edge[MAX_N];
vector<int> tree[MAX_N];
int p[MAX_N];
long long tot_cows[MAX_N];
long long d[MAX_N];
void dijkstra(int s)
{
for(int i = 0; i < n; i++) d[i] = LLONG_MAX;
priority_queue<ll, vector<ll>, greater<ll> > pq;
d[s] = 0;
pq.push(ll(s, d[s]));
while(!pq.empty()){
long long u = pq.top().second, k = pq.top().first;
pq.pop();
if(k != d[u]) continue;
if(u != 0){
tree[p[u]].push_back(u);
}
for(int i = 0; i < edge[u].size(); i++){
long long v = edge[u][i].first, w = edge[u][i].second;
if(d[v] > d[u] + w){
d[v] = d[u] + w;
p[v] = u;
pq.push(ll(d[v], v));
}
else if(d[v] == d[u] + w){
if(p[v] > u){
p[v] = u;
pq.push(ll(d[v], v));
}
}
}
}
}
long long dfs(int u)
{
tot_cows[u] = cows[u];
for(auto v : tree[u]){
tot_cows[u] += dfs(v);
}
return tot_cows[u];
}
int main()
{
freopen("shortcut.in","r",stdin);
freopen("shortcut.out","w",stdout);
cin>>n>>m>>t;
for(int i = 0; i < n; i++) cin>>cows[i];
for(int i = 0; i < m; i++){
long long u, v, w; cin>>u>>v>>w;
u--; v--;
edge[u].push_back(ll(v, w));
edge[v].push_back(ll(u, w));
}
p[0] = -1;
dijkstra(0);
tot_cows[0] = dfs(0); // find every all cows the node goes after
long long ans = 0;
for(int i = 0; i < n; i++){
ans = max(ans, (long long)((d[i] - t) * tot_cows[i]));
}
cout<<ans;
return 0;
}