zoukankan      html  css  js  c++  java
  • UVA 10039 Railroads

    这道题好吧,一开始便是拓扑排序的想法,搞了好久,试了多组测试数据,没错啊,可是没过。。。作孽啊,竟然忘了拓扑不能处理环,白浪费了一晚上。。。

    只好用动态规划了。。

    DP【time】【city】表示在time时刻到达city的最迟出发时间,当然,在这个时间不一定到city。

    转移方程挺简单,不说你也会。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <map>
     4 #include <iomanip>
     5 #include <string>
     6 #include <cstring>
     7 #include <algorithm>
     8 using namespace std;
     9 
    10 const int MAXN=105;
    11 const int MAXM=120000;
    12 const int inf=90000000;
    13 int head[MAXN];
    14 struct e{
    15     int u,v;
    16     int depart,arrival;
    17     int next;
    18 }edge[MAXM];
    19 int tot,n,m,limit;
    20 int start_city,des_city;
    21 string start,destin;
    22 int timeh[105][2450];
    23 
    24 void addedge(int u,int v,int de,int ar){
    25     edge[tot].u=u;
    26     edge[tot].v=v;
    27     edge[tot].depart=de;
    28     edge[tot].arrival=ar;
    29     edge[tot].next=head[u];
    30     head[u]=tot++;
    31 }
    32 
    33 void slove(){
    34     for(int e=head[start_city];e!=-1;e=edge[e].next){
    35         if(edge[e].depart>=limit){
    36             timeh[edge[e].v][edge[e].arrival]=edge[e].depart;
    37         }
    38     }
    39     for(int i=0;i<=2400;i++){
    40         for(int j=1;j<=n;j++){
    41             if(timeh[j][i]!=-1){
    42                 for(int e=head[j];e!=-1;e=edge[e].next){
    43                     if(i<=edge[e].depart){
    44                         timeh[edge[e].v][edge[e].arrival]=max(timeh[edge[e].v][edge[e].arrival],timeh[j][i]);
    45                     }
    46                 }
    47             }
    48         }
    49     }
    50     for(int i=0;i<=2400;i++){
    51         if(timeh[des_city][i]!=-1){
    52             cout << "Departure " << setw(4) << setfill('0');
    53             cout << timeh[des_city][i] << " " << start << endl;
    54             cout << "Arrival   " << setw(4) << setfill('0');
    55             cout << i << " " << destin << endl;
    56             return ;
    57         }
    58     }
    59     cout << "No connection" << endl;
    60 }
    61 
    62 int main(){
    63     string station,pre,cur;
    64     int cas=0;int T,pretime,curtime,u,v,train;
    65     scanf("%d",&T);
    66     while(T--){
    67         cas++; tot=0;
    68         memset(head,-1,sizeof(head));
    69         memset(timeh,-1,sizeof(timeh));
    70         map<string,int>city;
    71         scanf("%d",&n);
    72         for(int i=1;i<=n;i++){
    73             cin>>station;
    74             city[station]=i;
    75         }
    76         scanf("%d",&train);
    77         while(train--){
    78             scanf("%d",&m);
    79             for(int i=1;i<=m;i++){
    80                 cin>>curtime>>cur;
    81                 if(i>1){
    82                     u=city[pre];
    83                     v=city[cur];
    84                     addedge(u,v,pretime,curtime);
    85                 }
    86                 pre=cur;
    87                 pretime=curtime;
    88             }
    89         }
    90         cin>>limit>>start>>destin;
    91         start_city=city[start]; des_city=city[destin];
    92          cout << "Scenario " << cas << endl;
    93         slove();
    94         cout << endl;
    95     }
    96     return 0;
    97 }
    View Code
  • 相关阅读:
    操作 Java 数组的 12 个最佳方法
    详解 JavaScript 中 splice() 方法
    Java 读取 .properties 配置文件的几种方式
    表单中单选、多选、选择框值的获取及表单的序列化
    一个调出上下文菜单的实例
    跨浏览器的事件侦听器和事件对象
    动态加载js和css
    php语言实现的7种基本的排序方法
    CORS(跨源资源共享)实战
    ubuntu中LAMP环境搭建及ubuntu语言和输入法设置
  • 原文地址:https://www.cnblogs.com/jie-dcai/p/3862156.html
Copyright © 2011-2022 走看看