output
3 1 2 4
input
6 6 7 1 2 2 1 3 3 3 6 3 2 4 2 4 6 2 6 5 1
output
4 1 2 4 6
input
5 5 6 1 3 3 3 5 3 1 2 2 2 4 3 4 5 2
output
3 1 3 5
暴力dfs T了,想了想dp应该可以,先拓扑排序,然后按照顺序dp。
dp[i][j]表示从1到i走j步最多剩余多少time,状态转移方程为dp[v][k+1]=max(dp[v][k+1],dp[u][k]-e.cost),在维护一个pre数组标记路径。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
#include<cmath>
#include<stack>
const int inf=0x3f3f3f3f;
typedef long long LL;
using namespace std;
const int MAXN=5010;
struct edge
{
int to,cost;
edge()
{
}
edge(int t,int c)
{
to=t;
cost=c;
}
};
vector<edge> G[MAXN];
int pre[MAXN][MAXN];
int dp[MAXN][MAXN];
int Q[MAXN];
bool visit[MAXN];
int indegree[MAXN];
int num;
stack<int> S;
int n,m,T;
int a,b,c;
int max(int l,int r)
{
return l>r?l:r;
}
void TopoSort()
{
memset(visit,0,sizeof(visit));
for(int i=1;i<=n;i++)
{
if(!indegree[i]&&!visit[i])
{
Q[num++]=i;
}
}
for(int i=0;i<num;i++)
{
int u=Q[i];
for(int i=0;i<G[u].size();i++)
{
indegree[G[u][i].to]--;
if(!indegree[G[u][i].to])
Q[num++]=G[u][i].to;
}
}
}
int main()
{
while(cin>>n>>m>>T)
{
num=0;
for(int i=0;i<=n;i++)
{
G[i].clear();
}
memset(indegree,0,sizeof(indegree));
for(int i=1;i<=m;i++)
{
scanf("%d %d %d",&a,&b,&c);
G[a].push_back(edge(b,c));
indegree[b]++;
}
TopoSort();
// for(int i=0;i<num;i++)
// {
// cout<<Q[i]<<endl;
// }
memset(dp,-1,sizeof(dp));
memset(pre,-1,sizeof(pre));
dp[1][0]=T;
int va,u,v;
for(int i=0;i<num;i++)
{
u=Q[i];
for(int j=0;j<G[u].size();j++)
{
v=G[u][j].to;
va=G[u][j].cost;
//cout<<u<<" "<<v<<" "<<va<<endl;
for(int k=0;k<=n;k++)
{
if(dp[u][k]>=va)
{
// cout<<dp[u][k]<<endl;
//cout<<dp[v][k+1]<<endl;
if(dp[v][k+1]<dp[u][k]-va)
{
dp[v][k+1]=dp[u][k]-va;
pre[v][k+1]=u;
}
}
}
}
}
// for(int i=1;i<=n;i++)
// {
// for(int j=0;j<=n;j++)
// {
// cout<<dp[i][j]<<" ";
// }
// cout<<endl;
// }
// for(int i=1;i<=n;i++)
// {
// for(int j=0;j<=n;j++)
// {
// cout<<pre[i][j]<<" ";
// }
// cout<<endl;
// }
int MAX;
for(int i=n;i>=0;i--)
{
if(dp[n][i]>=0)
{
MAX=i+1;
break;
}
}
cout<<MAX<<endl;
int t=MAX-1;
S.push(n);
while(pre[n][t]!=-1)
{
n=pre[n][t];
t--;
S.push(n);
//cout<<n<<" "<<t<<endl;
}
cout<<S.top();
S.pop();
while(!S.empty())
{
cout<<" "<<S.top();
S.pop();
}
cout<<endl;
}
return 0;
}