已经调了两小时了求助,WA53
查看原帖
已经调了两小时了求助,WA53
661094
liyifan202201楼主2025/1/19 10:45

最后一直指向 0 ,怎么回事

#include<bits/stdc++.h>
using namespace std;
const int N=5e3+5;
struct node{
	int x,w;
};
int l=1,r=0;
int dp[N][N],in[N],que[N],stk[N],tp=0;
int n,m,k,x,y,w;
int lst[N][N];
vector<node>c[N];
void tra(int x,int y,int w){
	for(int i=2;i<=n;i++){
		if (dp[x][i-1]+w>k)continue;
		if(dp[y][i]>dp[x][i-1]+w){
			dp[y][i]=dp[x][i-1]+w;
			lst[y][i]=x;
		}
	}
}
signed main(){
	cin>>n>>m>>k;
	for(int i=1;i<=m;i++){
		cin>>x>>y>>w;
		if(x!=y){
			c[x].push_back((node){y,w});
			in[y]++; 
		}
	}
	memset(dp,0x7f,sizeof(dp));
	for(int i=1;i<=n;i++)
		if(in[i]==0)
			que[++r]=i;
	while(l<=r){
		int cur=que[l];	
		if(cur==0) 
			continue; 
		if(cur==1)
			dp[1][1]=0;
		for(int i=0;i<c[cur].size();i++){
			int nxt=c[cur][i].x,w=c[cur][i].w;
			tra(cur,nxt,w);
			in[nxt]--;
			if(in[nxt]==0)
				que[++r]=nxt;
		}
		l++;
	}	
	int ans=0,cur=n;
	for(int i=1;i<=n;i++)
		if(dp[n][i]<=k)
			ans=max(ans,i);
	cout<<ans<<'\n';
	while(ans!=0){
		stk[++tp]=cur;
		cur=lst[cur][ans];
		ans--;
	}
	while(tp)
		cout<<stk[tp--]<<' ';
	return 0;
} 
/*

*/
2025/1/19 10:45
加载中...