[CFgym101061C]Ramzi(贪心,双条件最短路)

题目链接:http://codeforces.com/gym/101061/problem/C

题意:一张图,图上的边有两种,一种是车道,一种是人行道。一个人要从A点到B点,可以坐车也可以走人行道。这个人希望在走最少的路的情况下尽可能早地到达B点(保证走路最少的清空下坐车时间最少),问要走多少路,一共花费多久。

pair<int, int>保存这个人需要走路的时间和共计的时间,读入更新图的时候需要判断仔细。利用pair自身比较运算符优先判断first元素可以直接跑floyd。

  1 /*
  2 ━━━━━┒ギリギリ♂ eye!
  3 ┓┏┓┏┓┃キリキリ♂ mind!
  4 ┛┗┛┗┛┃\○/
  5 ┓┏┓┏┓┃ /
  6 ┛┗┛┗┛┃ノ)
  7 ┓┏┓┏┓┃
  8 ┛┗┛┗┛┃
  9 ┓┏┓┏┓┃
 10 ┛┗┛┗┛┃
 11 ┓┏┓┏┓┃
 12 ┛┗┛┗┛┃
 13 ┓┏┓┏┓┃
 14 ┃┃┃┃┃┃
 15 ┻┻┻┻┻┻
 16 */
 17 #include <algorithm>
 18 #include <iostream>
 19 #include <iomanip>
 20 #include <cstring>
 21 #include <climits>
 22 #include <complex>
 23 #include <cassert>
 24 #include <cstdio>
 25 #include <bitset>
 26 #include <vector>
 27 #include <deque>
 28 #include <queue>
 29 #include <stack>
 30 #include <ctime>
 31 #include <set>
 32 #include <map>
 33 #include <cmath>
 34 //#include <unordered_map>
 35 using namespace std;
 36 #define fr first
 37 #define sc second
 38 #define cl clear
 39 #define BUG puts("here!!!")
 40 #define W(a) while(a--)
 41 #define pb(a) push_back(a)
 42 #define Rint(a) scanf("%d", &a)
 43 #define Rll(a) scanf("%I64d", &a)
 44 #define Rs(a) scanf("%s", a)
 45 #define Cin(a) cin >> a
 46 #define FRead() freopen("in", "r", stdin)
 47 #define FWrite() freopen("out", "w", stdout)
 48 #define Rep(i, len) for(int i = 0; i < (len); i++)
 49 #define For(i, a, len) for(int i = (a); i < (len); i++)
 50 #define Cls(a) memset((a), 0, sizeof(a))
 51 #define Clr(a, x) memset((a), (x), sizeof(a))
 52 #define Full(a) memset((a), 0x7f7f7f, sizeof(a))
 53 #define lrt rt << 1
 54 #define rrt rt << 1 | 1
 55 #define pi 3.14159265359
 56 #define RT return
 57 #define lowbit(x) x & (-x)
 58 #define onenum(x) __builtin_popcount(x)
 59 typedef long long LL;
 60 typedef long double LD;
 61 typedef unsigned long long ULL;
 62 typedef pair<int, int> pii;
 63 typedef pair<string, int> psi;
 64 typedef pair<LL, LL> pll;
 65 typedef map<string, int> msi;
 66 typedef vector<int> vi;
 67 typedef vector<LL> vl;
 68 typedef vector<vl> vvl;
 69 typedef vector<bool> vb;
 70
 71 pii operator+(pii A, pii B) {
 72     return pii(A.first + B.first, A.second + B.second);
 73 }
 74 const int maxn = 1010;
 75 int n, m;
 76 pii dp[maxn][maxn];
 77
 78 int main() {
 79 //    FRead();
 80     int T;
 81     int x, y, c, k;
 82     Rint(T);
 83     W(T) {
 84         Rint(n); Rint(m);
 85         Rep(i, n+5) {
 86             Rep(j, n+5) dp[i][j] = pii(9000000, 9000000);
 87             dp[i][i] = pii(0, 0);
 88         }
 89         Rep(i, m) {
 90             Rint(x); Rint(y); Rint(c); Rint(k);
 91             if(k == 1) {
 92                 if(dp[x][y].first > c) {
 93                     dp[x][y].first = min(dp[x][y].first, c);
 94                     dp[y][x].first = min(dp[y][x].first, c);
 95                     dp[x][y].second = min(dp[x][y].second, c);
 96                     dp[y][x].second = min(dp[y][x].second, c);
 97                 }
 98             }
 99             else {
100                 if(dp[x][y].first != 0) {
101                     dp[x][y].first = dp[y][x].first = 0;
102                     dp[x][y].second = dp[y][x].second = c;
103                 }
104                 else {
105                     dp[x][y].second = min(dp[x][y].second, c);
106                     dp[y][x].second = min(dp[y][x].second, c);
107                 }
108             }
109         }
110         For(k, 1, n+1) For(i, 1, n+1) For(j, 1, n+1)
111         dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j]);
112         Rint(x); Rint(y);
113         if(dp[x][y].second >= 9000000) puts("-1");
114         else printf("%d %d\n", dp[x][y].first, dp[x][y].second);
115     }
116     RT 0;
117 }
时间: 2024-12-18 00:02:35

[CFgym101061C]Ramzi(贪心,双条件最短路)的相关文章

HDU 3790-最短路径问题(双权最短路)

最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 13700    Accepted Submission(s): 4201 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. Input

hdu5380 贪心+双端队列

http://acm.hdu.edu.cn/showproblem.php?pid=5380 Problem Description There are n+1 cities on a line. They are labeled from city 0 to city n. Mph has to start his travel from city 0, passing city 1,2,3...n-1 in order and finally arrive city n. The dista

zoj 3233 容斥原理 + 双条件

题目来源: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3490 题意:  给出两个集合Y , N , 给出区间[low , high] , 问在 这个区间有多少个这样的数,x ,  满足, 集合Y中至少一个数被x 整除, 且 集合 N中至少一个数不被x 整除. 分析:两个条件 Q1 :  集合Y中至少一个数被x 整除 , 满足这个条件的个数为 A: Q2 :  集合 N中至少一个数不被x 整除. 满足这个条件的个数为B

【日常学习】【条件最短路dij】POJ1062 昂贵的聘礼(2002年浙江省队选拔赛) 题解

耗时三节课 充分体现出粗心酿成大错这个道理 一开始一直不知道为什么数组越界 原来是minn和ninj写反了 后来又因为杜如函数出为题 反复调试 今后一定要注意 题目还是放上吧: 题目描述 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如果你能够弄来他的水晶球,那么只要5

python-联系-双条件-if-else

age=float(raw_input("enter your age:"))    grade=int(raw_input("enter your grade:"))     if age >=8:         if grade >=3:             print "you can play this game."     else:          print "sorry ,you can't play

【CF700B】Connecting Universities(想法题,贪心,树上最短路)

题意:给出一棵树上的2*k个节点,给他们配对,使得他们之间的距离和最大. 思路:一条边的两侧如果有一侧没有给定的节点就不会被经过…… 如果有1个节点就会被经过1次…… 如果两侧分别有x,y个给定节点就会被经过min(x,y)次 因为要使总路程最大就是让每一条路被走过最多的次数 肯定是两侧各取一个 剩下的只能在某侧内部解决 所以按此统计即可 答案很大 用INT64 1 var head,vet,next,a,b,c,dep,flag,f:array[1..500000]of longint; 2

【CF 507E】Breaking Good

[CF 507E]Breaking Good 双条件最短路 每个路有已搭建和未搭建两种状态 需要把经过的路都建起 为经过的路都拆掉 优先经过最少条路 同样少的路走改动(搭建+拆掉)最小的 最短路跑完后把最短的路上的路径标记一下 bfs输出拆除和搭建 在最短路径上的路 未建的搭建 不在的建好的拆掉 通过此题试了一下spfa的一个小优化还有dijkstra的优先队列优化 不过别看spfa加优化快了点 前两天做了个专门卡这个优化的题--想方设法让他多跑就是..HDOJ 4889 有兴趣的可以去瞅瞅 此

ACdream 1415 最短路+桥

点击打开链接 题意:给个图,问你从1到n的最短路的路径上,有多少桥 思路:先是要满足条件最短路,然后判断每条边是不是最短路里的边,怎么判断也很简单,先从1开始求最短路和从n开始求最短路,对于边U到V来说,若1到U的最短路加上n到V的最短路在加上这条边的权值若等于1到n的最短路,那么这条边就是我们要的,就是这个条件if(dis1[U[i]]+COST[i]+dis2[V[i]]==maxdis||dis1[V[i]]+COST[i]+dis2[U[i]]==maxdis)maxdis是1到n的最短

Excel各种条件求和的公式汇总

经常和Execl打交道的人肯定觉得求和公式是大家时常用到的.Excel里有哪几路求和公式呢?他们的使用方式又是怎样?我为大家汇总一下. 使用SUMIF()公式的单条件求和: 如要统计C列中的数据,要求统计条件是B列中数据为"条件一".并将结果放在C6单元格中,我们只要在C6单元格中输入公式“=SUMIF(B2:B5,"条件一",C2:C5)”即完成这一统计.   SUM()函数+IF()函数嵌套的方式双条件求和: 如统计生产一班生产的质量为“合格”产品的总数,并将结