C. Journey(拓扑dp)

这是真没想到,其实也不难的

考 虑 d p . 但 是 状 态 有 点 存 不 下 , 毕 竟 每 条 路 的 花 费 到 了 1 e 9 级 别 考虑dp.但是状态有点存不下,毕竟每条路的花费到了1e9级别 dp.,1e9

那 不 如 令 d p [ i ] [ j ] 表 示 从 1 到 i 走 了 j 个 节 点 的 最 小 花 费 那不如令dp[i][j]表示从1到i走了j个节点的最小花费 dp[i][j]1ij

那 么 拓 扑 排 序 , 1 是 入 度 为 0 的 点 那么拓扑排序,1是入度为0的点 ,10

一 层 一 层 维 护 下 来 一层一层维护下来

#include 
using namespace std;
const int maxn=5009;
typedef long long ll;
#define f first
#define s second
#define GO std::ios::sync_with_stdio(false)
int n,m,in[maxn],path[maxn][maxn];
typedef pairp;
vector

vec[maxn]; queueq; int dp[maxn][maxn],t; void TuoPuSort() { //dp[i][j]?????i??????j???????С??? for(int i=0;i<=5000;i++) for(int j=0;j<=5000;j++) dp[i][j]=1e9+10; dp[1][1]=0;//???1?????0,???????1???? for(int i=1;i<=n;i++) if(in[i]==0) q.push(i); while( !q.empty() ) { int u=q.front(); q.pop(); for(int i=0;idp[u][j-1]+v.s) { dp[v.f][j]=dp[u][j-1]+v.s; path[v.f][j]=u; } } } } } void dfs(int now,int num) { if(num==1) { cout<<1<<" "; return;} dfs(path[now][num],num-1); cout << now << " "; } int main() { GO; cin >> n >> m >> t; for(int i=1,l,r,w;i<=m;i++) { cin >> l >> r >> w; vec[l].push_back( p(r,w) ); in[r]++; } TuoPuSort(); int res=0; for(int i=n;i>=1;i--) if(dp[n][i]<=t) { res=i; break; } cout<

你可能感兴趣的:(CF刷题计划)