题目:http://codeforces.com/contest/721/problem/C
题目大意:给定n个点,m条边,时间t,求 从起点1 到终点n 在时间t内 最多走多少个点。
#include<iostream>
#include<string.h>
#include<stack>
using namespace std;
#define MAXN 5010
#define INF 1e9+2
int dp[MAXN][MAXN];
int rec[MAXN][MAXN];
struct ROAD{
int a,b; //节点
int w; //边的权
};
int main(){
int n,m,t;
ROAD road[MAXN];
while(cin>>n>>m>>t){
stack<int>ans;
memset(rec,-1,sizeof(rec));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dp[i][j]=INF;
int num=0;
for(int i=0;i<m;i++){
cin>>road[i].a>>road[i].b>>road[i].w;
}
dp[1][1]=0; //经过1个点到1号位置的距离为0
for(int i=2;i<=n;i++){
for(int j=0;j<m;j++){
int a=road[j].a;
int b=road[j].b;
int w=road[j].w;
//dp[i][j]表示经过i个点到达j号点的最短距离(时间)
//rec[i][j]=a表示经过i个点到b点经过(且距离b最近)的点为a
if(dp[i-1][a]+w<dp[i][b]){
dp[i][b]=dp[i-1][a]+w;
rec[i][b]=a;
}
}
if(dp[i][n]<=t) num=i; //想找i满足条件的最大的
}
cout<<num<<endl;
int cur=n;
for(int i=num;i>=1;i--){
ans.push(cur);
cur=rec[i][cur]; //循环中i每次自减1,可以得出每次经过的点 经过num个点到达当前点的点是p,经过num-1个点到达p点的点是q...
}
while(!ans.empty()){
cout<<ans.top()<<" ";
ans.pop();
}
cout<<endl;
}
return 0;
}