zoukankan      html  css  js  c++  java
  • 【COGS 254】【POI 2001】交通网络图

    http://www.cogs.top/cogs/problem/problem.php?pid=254

    dist[i]表示能最早到达i点的时间。这样就可以用最短路模型来转移了。

    #include<queue>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int N = 1003;
    const int K = 2003;
    int in() {
    	int k = 0, fh = 1; char c = getchar();
    	for(; c < '0' || c > '9'; c = getchar())
    		if (c == '-') fh = -1;
    	for(; c >= '0' && c <= '9'; c = getchar())
    		k = (k << 3) + (k << 1) + c - '0';
    	return k * fh;
    }
    
    struct que {
    	int id, dist;
    	que(int _id = 0, int _dist = 0) : id(_id), dist(_dist) {}
    	bool operator < (const que &A) const {
    		return dist > A.dist;
    	}
    };
    struct node {int nxt, to, w, c, sum;} E[10003];
    int gx, mx, x, y, n, k, cnt = 0, point[N];
    int p[N], r[N], dist[N], pre[N], note[N];
    bool vis[N];
    
    void ins(int u, int v, int w, int c, int sum) {
    	E[++cnt] = (node) {point[u], v, w, c, sum}; point[u] = cnt;
    }
    
    int cal(int a, int b, int c) {
    	a = a % c; b = b % c;
    	if (a >= b) return a - b;
    	else return a - b + c;
    }
    
    void dijkstra() {
    	priority_queue <que> q;
    	q.push(que(x, dist[x]));
    	que u; int t;
    	while (!q.empty()) {
    		u = q.top(); q.pop();
    		if (vis[u.id]) continue;
    		vis[u.id] = true;
    		for(int i = point[u.id]; i; i = E[i].nxt)
    			if ((t = (dist[u.id] + cal(E[i].sum, dist[u.id], E[i].c) + E[i].w)) < dist[E[i].to])
    				dist[E[i].to] = t, q.push(que(E[i].to, t));
    	}
    }
    
    int main() {
    	freopen("pod.in", "r", stdin);
    	freopen("pod.out", "w", stdout);
    	n = in(); k = in(); x = in(); y = in(); gx = in(); mx = in();
    	int s, c, ret;
    	for(int i = 1; i <= k; ++i) {
    		s = in(); c = in();
    		for(int i = 1; i <= s; ++i)
    			p[i] = in();
    		for(int i = 1; i < s; ++i)
    			r[i] = in();
    		ret = 0;
    		for(int i = 1; i < s; ++i) {
    			ins(p[i], p[i + 1], r[i], c, ret);
    			ret += r[i];
    		}
    		ret = 0;
    		for(int i = s - 1; i >= 1; --i) {
    			ins(p[i + 1], p[i], r[i], c, ret);
    			ret += r[i];
    		}
    	}
    		
    	memset(dist, 127, sizeof(int) * (n + 1));
    	dist[x] = mx;
    	dijkstra();
    	
    	ret = dist[y];
    	printf("%d %d
    ", (gx + ret / 60) % 24, ret % 60);
    	
    	return 0;
    }
    

  • 相关阅读:
    cogs luogu 1901. [国家集训队2011]数颜色 待修改莫队
    luogu cogs 421. HH的项链
    luogu P2709 小B的询问
    排序
    算法基本概念
    金融的简单介绍
    Admin组件-----Django自带
    day02-菜单处理
    day01
    selenium常用方法
  • 原文地址:https://www.cnblogs.com/abclzr/p/5796063.html
Copyright © 2011-2022 走看看