• PTA 森森旅游 (30 分) | 堆优化迪杰斯特拉


    在这里插入图片描述

    6 11 3
    1 2 3 5
    1 3 8 4
    2 4 4 6
    3 1 8 6
    1 3 10 8
    2 3 2 8
    3 4 5 3
    3 5 10 7
    3 3 2 3
    4 6 10 12
    5 6 10 6
    3 4 5 2 5 100
    1 2
    2 1
    1 17
    
    
    8
    8
    1
    
    

    在这里插入图片描述
    Code:

    typedef pair<long long, int> PII;
    int n, m, q;
    int head1[maxn], head2[maxn];
    ll dis1[maxn], dis2[maxn];
    struct node {
    	int v, to, nex;
    	int w;
    }e[maxn << 2];
    int idx;
    multiset<ll> mst;
    void init() {
    	idx = 0;
    	memset(head1, -1, sizeof head1);
    	memset(head2, -1, sizeof head2);
    }
    void add(int h[], int u, int v, int w) {
    	e[idx].v = v;
    	e[idx].nex = h[u];
    	e[idx].w = w;
    	h[u] = idx++;
    }
    bool vis[maxn];
    void dij(ll dis[], int head[], int st) {
    	memset(dis, 0x3f3f3f3f3f3f3f3f, sizeof dis1);
    	memset(vis, 0, sizeof vis);
    	priority_queue <PII, vector<PII>, greater<PII> > que;
    	que.push({ 0,st });
    	dis[st] = 0;
    	while (que.size()) {
    		int u = que.top().second;
    		que.pop();
    		if (vis[u]) continue;
    		vis[u] = 1;
    		for (int i = head[u]; ~i; i = e[i].nex) {
    			//	cout << e[i].v << endl;
    			int to = e[i].v;
    			if (dis[to] > dis[u] + e[i].w) {
    				dis[to] = dis[u] + e[i].w;
    				que.push({ dis[to],to });
    			}
    		}
    	}
    }
    int a[maxn];
    void getAns() {
    	for (int i = 1; i <= n; i++) {
    		if (dis1[i] == 0x3f3f3f3f3f3f3f3f) continue;
    		if (dis2[i] == 0x3f3f3f3f3f3f3f3f) continue;
    		ll val = dis1[i] + (dis2[i] + a[i] - 1) / a[i];
    		mst.insert(val);
    		// puts("add");
    	}
    	for (int qq = 1; qq <= q; qq++) {
    		// 	puts("qq");
    		int x = read, aa = read;
    		if (dis1[x] != 0x3f3f3f3f3f3f3f3f && dis2[x] != 0x3f3f3f3f3f3f3f3f) {
    			ll t = dis1[x] + (dis2[x] + a[x] - 1) / a[x];
    			mst.erase(mst.find(t));
    			a[x] = aa;
    			ll val = dis1[x] + (dis2[x] + aa - 1) / aa;
    			mst.insert(val);
    		}
    		printf("%lld\n", *mst.begin());
    	}
    }
    int main() {
    	n = read, m = read, q = read;
    	init();
    	memset(dis1, 0x3f3f3f3f3f3f3f3f, sizeof dis1);
    	memset(dis2, 0x3f3f3f3f3f3f3f3f, sizeof dis2);
    	for (int i = 1; i <= m; i++) {
    		int u = read, v = read, c = read, d = read;
    		add(head1, u, v, c);
    		add(head2, v, u, d);
    	}
    	for (int i = 1; i <= n; i++) a[i] = read;
    	dij(dis1, head1, 1);
    	dij(dis2, head2, n);
    	/*
    	for (int i = 1; i <= n; i++) {
    		cout << dis1[i] << " " << dis2[i] << endl;
    	}*/
    	getAns();
    	return 0;
    }
    /**
    6 11 3
    1 2 3 5
    1 3 8 4
    2 4 4 6
    3 1 8 6
    1 3 10 8
    2 3 2 8
    3 4 5 3
    3 5 10 7
    3 3 2 3
    4 6 10 12
    5 6 10 6
    3 4 5 2 5 100
    1 2
    2 1
    1 17
    
    **/
    
    
  • 相关阅读:
    消息中间件(MQ)
    java Lambda表达式
    【测试】性能测试及性能测试工具JMeter
    【Mysql】mysql集群方案之读写分离
    linux下mysql开启远程访问权限及防火墙开放3306端口
    MySQL事务提交与回滚
    MySQL索引
    MySQL视图
    MySQL事务
    MySQL参数化有效防止SQL注入
  • 原文地址:https://www.cnblogs.com/PushyTao/p/16196700.html
Copyright © 2020-2023  润新知