POJ 3159 最短路dij优先队列模板 差分约束

来源:互联网 发布:算法的乐趣.pdf 编辑:程序博客网 时间:2024/06/15 01:44

题意:第一行n,m,n个点,m条边,接下来m行,告诉你a,b,c,代表着b最多比a多c块糖,问的是1最多比n多几块。。 

思路:差分约束第一道题,留念~这道题spfa各种跪=。=,敲了个没加优化的dij依旧跪,然后才开始敲了第一次优先队列优化的dij.....

差分约束我刚开始看,不妄加评论了=。=

代码:

#include<cstdio>#include<cstring>#include<iostream>#include<queue>#include<vector>using namespace std;const int maxn = 30010;const int maxm = 150010;const int inf = 0x3f3f3f3f;struct Side{    int v,w,next;}side[maxm];int node[maxn],top;void add_side(int u,int v,int w){    side[top].v = v;    side[top].w = w;    side[top].next = node[u];    node[u] = top++;}class Cmp{    public:    bool operator()(const pair<int,int> &a,const pair<int,int> &b){        return a.first > b.first;    }};int n,m;int dis[maxn];bool vis[maxn];priority_queue<pair<int,int>,vector<pair<int,int> >,Cmp>q;int dijkstra(int s,int t){    for(int i = 0;i <= n;i ++)        dis[i] = inf;    q.push(make_pair(0,s));    while(!q.empty()){        pair<int,int> tmp = q.top();q.pop();        int u = tmp.second;        if(dis[u]!=inf)continue;        dis[u] = tmp.first;        for(int i = node[u];i != -1;i = side[i].next){            q.push(make_pair(dis[u] + side[i].w,side[i].v));        }    }    return dis[t];}int main(){    top = 0;    memset(node,-1,sizeof(node));    scanf("%d%d",&n,&m);    while(m--){        int a,b,c;        scanf("%d%d%d",&a,&b,&c);        add_side(a,b,c);    }    int ans = dijkstra(1,n);    printf("%d\n",ans);    return 0;}
重新说下对优先队列优化的dij 的理解:dijkstra是每次确定一个点的最短路,每次找到一个距离不是inf的店,说明之前的距离没有确定,而且现在的距离是最小的,所以这个点的最短距离就确定了,然后更新,原先的理解有点错误。。

0 0
原创粉丝点击