P2865 [USACO06NOV]路障Roadblocks

次短路模板题吧

题意已经非常裸了:求无向图的1到n次短路。

直接套用最短路(dijkstra)的主要框架。但在这个的基础上添加另外一个数组dist2

走到一条边的时候来三个判定:

  1. dist[u] + weight < dist[v]直接可以更新最短路,新的次短路就是曾经的最短路。

  2. dist[u] + weight > dist[v] && dist[u] + weight < dist2[v]不可更新最短路,但可以更新次短路。

  3. dist2[u] + weight < dist2[v]可以更新次短路。

然后就可以差不多写出来了。

话说这道题数据水。

代码:

#include<cstdio>
#include<cstring>
#include<queue>
const int maxn = 5005, maxm = 100005;
struct Edges
{
    int next, to, weight;
} e[maxm << 1];
int head[maxn], tot;
int dist[maxn], dist2[maxn];

int n, m;
struct Heapnodes
{
    int d, u;
    bool operator < (const Heapnodes &rhs) const
    {
        return d > rhs.d;
    }
};
void link(int u, int v, int w)
{
    e[++tot] = (Edges){head[u], v, w};
    head[u] = tot;
}
void dijkstra(int s, int t)
{
    memset(dist, 0x3f, sizeof dist);
    memset(dist2, 0x3f, sizeof dist2);// 0x7f???
    std::priority_queue<Heapnodes> heap;
    dist[s] = 0; heap.push((Heapnodes){dist[s], s});
    while(!heap.empty())
    {
        Heapnodes x = heap.top(); heap.pop();
        int d = x.d, u = x.u;
        if(d != dist[u]) continue;
        for(int i = head[u]; i; i = e[i].next)
        {
            int v = e[i].to;
            if(dist[u] + e[i].weight < dist[v])
            {
                dist2[v] = dist[v];
                dist[v] = dist[u] + e[i].weight;
                heap.push((Heapnodes){dist[v], v});
            }
            if(dist[u] + e[i].weight > dist[v] && dist[u] + e[i].weight < dist2[v])
            {
                dist2[v] = dist[u] + e[i].weight;
                heap.push((Heapnodes){dist[v], v});
            }
            if(dist2[u] + e[i].weight < dist2[v])
            {
                dist2[v] = dist2[u] + e[i].weight;
                //heap.push((Heapnodes){dist[v], v});
            }
        }
    }
}
int main()
{
    scanf("%d%d", &n, &m);
    while(m--)
    {
        int u, v, w; scanf("%d%d%d", &u, &v, &w);
        link(u, v, w); link(v, u, w);
    }
    dijkstra(1, n);
    printf("%d\n", dist2[n]);
    return 0;
}
``
posted @ 2018-11-04 20:50  Garen-Wang  阅读(152)  评论(0编辑  收藏  举报