zoukankan      html  css  js  c++  java
  • POJ 3255 Roadblocks

    传送门

    分析:

    记录最短值和次短值,每次dijkstra更新。
    注意:

    • 如果用从que中取出的值更新了最短值,那么就将最短值放入que中。
    • 如果用从que中取出的值更新了次短值,那么就将次短值放入que中。
    • 从que中取出值后,设取出的最短/次短值为dist,那么在后续更新中写成(dis[v] = dist + len)而非(dis[v] = dis[u] + len.),因为无法判断是该值u的最短值或次短值(也可以在状态中加入最短和次短的标记。)

    code:

    #include<cstdio>
    #include<iostream>
    #include<vector>
    #include<queue>
    #include<cstring>
    using namespace std;
    const int N = 5005, R = 1e5 + 50, OO = 0x3f3f3f3f;
    int n, r, dis[N], dis2[N];
    typedef pair<int, int> P;
    vector<P> G[N];
    bool vst[N];
    priority_queue<P, vector<P>, greater<P> > que;
    
    inline void DJ(){
    	memset(dis, OO, sizeof dis);
    	memset(dis2, OO, sizeof dis2);
    	dis[1] = 0;
    	que.push(P(0, 1));
    	while(!que.empty()){
    		P t = que.top(); que.pop();
    		int u = t.second, dist = t.first;
    		for(int e = G[u].size() - 1; e >= 0; e--){
    			int v = G[u][e].first;
    			if(dis[v] > dist + G[u][e].second){
    				dis2[v] = dis[v];
    				dis[v] = dist + G[u][e].second;
    				que.push(P(dis[v], v));
    			}
    			else if(dis2[v] > dist + G[u][e].second){
    				dis2[v] = dist + G[u][e].second;
    				que.push(P(dis2[v], v));
    			}
    		}
    	}
    }
    
    int main(){
    //	freopen("h.in", "r", stdin);
    	scanf("%d%d", &n, &r);
    	for(int i = 1; i <= r; i++){
    		int a, b, d; scanf("%d%d%d", &a, &b ,&d);
    		G[a].push_back(P(b, d));
    		G[b].push_back(P(a, d));
    	}
    	DJ();
    	printf("%d", dis2[n]);
    	return 0;
    }
    
  • 相关阅读:
    Expert Shell Scripting
    tr [a-z] [A-Z]
    ssh
    scp
    sort 命令
    cut 命令使用
    oracle 对象权限 系统权限 角色权限
    从linux内核中学到的编程技巧 【转】
    2019.3.16 最小生成树之城市改造
    2019.1.23 01迷宫
  • 原文地址:https://www.cnblogs.com/CzYoL/p/7814625.html
Copyright © 2011-2022 走看看