社区讨论
Mn Zn 95pts求助
P9981[USACO23DEC] Minimum Longest Trip G参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lql0qmgd
- 此快照首次捕获于
- 2023/12/25 22:33 2 年前
- 此快照最后确认于
- 2023/12/25 22:59 2 年前
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 10;
typedef pair<int,int> pii;
int n,m,dist[N],sum[N];
int d1[N],d2[N];
vector<pair<int,int>> g[N],f[N];
inline void solve()
{
queue<int> q;
for(int i = 1;i <= n;i++)
if(d1[i] == 0)
q.push(i);
while(!q.empty())
{
int u = q.front();
q.pop();
for(auto [v,w] : g[u])
{
dist[v] = max(dist[v],dist[u] + 1);
d1[v]--;
if(d1[v] == 0)
q.push(v);
}
}
while(q.size()) q.pop();
for(int i = 1;i <= n;i++)
if(d2[i] == 0)
q.push(i);
while(!q.empty())
{
int u = q.front();
q.pop();
int minx = 2e18,rec = 0;
sum[rec] = 2e18;
for(auto [v,w] : f[u])
if(minx >= w && dist[v] == dist[u] - 1)
{
if(sum[v] < sum[rec] || minx > w)
rec = v;
minx = w;
}
if(f[u].empty()) minx = 0;
if(rec == 0) sum[u] = minx;
else sum[u] = sum[rec] + minx;
for(auto [v,w] : g[u])
if(--d2[v] == 0)
q.push(v);
}
return ;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
for(int i = 1;i <= m;i++)
{
int u,v,w;
cin >> u >> v >> w;
g[v].push_back({u,w});
f[u].push_back({v,w});
d1[u]++;d2[u]++;
}
solve();
for(int i = 1;i <= n;i++)
cout << dist[i] << " " << sum[i] << endl;
return 0;
}
rt.最后一个点120000多行被卡了,实在看不出啥问题,思路大概就是从后向前dp转移,谢谢大佬们!
回复
共 0 条回复,欢迎继续交流。
正在加载回复...