Codeforces R374 Div2 - Problem C - Journey

题目: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值