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 }

UVA 10039 Railroads

时间: 2024-11-08 00:11:13

UVA 10039 Railroads的相关文章

编程题目分类(剪辑)

1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 11. 模拟 12. 算术与代数 13. 组合问题 14. 数论 15. 网格,几何,计算几何 [编程入门] PC 110101, uva 100, The 3n+1 problem, 难度 1 PC 110102, uva 10189, Minesweeper, 难度 1 PC 110103, uva 10137, The T

计划,,留

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinejudge.org 西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ. 一.<算法竞赛入门经典> 刘汝佳 (UVaOJ 351道题) 以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html "AOAPC I"

算法竞赛入门经典+挑战编程+USACO

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发.   一.UVaOJ http://uva.onlinejudge.org  西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ.   二.<算法竞赛入门经典> 刘汝佳  (UVaOJ  351道题)  以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html   "AO

(Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinejudge.org 西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ. 二.<算法竞赛入门经典> 刘汝佳  (UVaOJ  351道题)  以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html “AOAPC I”是刘汝佳(大

UVA 562 Dividing coins --01背包的变形

01背包的变形. 先算出硬币面值的总和,然后此题变成求背包容量为V=sum/2时,能装的最多的硬币,然后将剩余的面值和它相减取一个绝对值就是最小的差值. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 50007 int c[102],d

UVA 10341 Solve It

Problem F Solve It Input: standard input Output: standard output Time Limit: 1 second Memory Limit: 32 MB Solve the equation: p*e-x + q*sin(x) + r*cos(x) + s*tan(x) + t*x2 + u = 0 where 0 <= x <= 1. Input Input consists of multiple test cases and te

UVA 11014 - Make a Crystal(容斥原理)

UVA 11014 - Make a Crystal 题目链接 题意:给定一个NxNxN的正方体,求出最多能选几个整数点.使得随意两点PQ不会使PQO共线. 思路:利用容斥原理,设f(k)为点(x, y, z)三点都为k的倍数的点的个数(要扣掉一个原点O).那么全部点就是f(1),之后要去除掉共线的,就是扣掉f(2), f(3), f(5)..f(n).n为素数.由于这些素数中包括了合数的情况,而且这些点必定与f(1)除去这些点以外的点共线,所以扣掉.可是扣掉后会扣掉一些反复的.比方f(6)在f

[UVa] Palindromes(401)

UVA - 401 Palindromes Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description A regular palindrome is a string of numbers or letters that is the same forward as backward. For example, the string "ABCDED

uva 401.Palindromes

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=342 题目意思:给出一段字符串(大写字母+数字组成).判断是否为回文串 or 镜像串 or 回文镜像串 or 什么都不是.每个字母的镜像表格如下 Character Reverse Character Reverse Character Reverse A A M M Y Y B