UVa 10986 Sending email 优先队列优化的dijkstra 和 朴素dijkstra 效率对比

来源:互联网 发布:Linux 13位密码破解 编辑:程序博客网 时间:2024/05/16 03:03


/***   原来是想把这题用来dijkstra练手的,突然到不如来测测dijkstra用优先队列优化之后效率的变化情况*   本想如果优化效果不是很明显的话,就无所谓用哪个了。。结果。。。这题居然。。。不优化就T !!*   直接上代码了。。dijkstra()是朴素的  dijkstra_q() 是优先队列优化后的。*/#include <cstdio>#include <iostream>#include <cstring>#include <cmath>#include <string>#include <queue>#include <map>#include <vector>#include <algorithm>#define DEBUG 0#define INF 0x1fffffff#define MAXS 20005typedef long long LL;using namespace std;int dis[MAXS], vis[MAXS];int n, m, s, e;struct Edge {    int v, w;    Edge() {}    Edge(int vv, int ww) {v = vv; w = ww;}};struct Node {    int v, d;    Node() {}    Node(int vv, int dd) {v = vv; d = dd;}    bool operator < (const Node &a) const {        return d > a.d;    }};vector<Edge> ver[MAXS];void init(){    for(int i = 0; i <= n; i ++)    {        dis[i] = INF;        vis[i] = 0;        ver[i].clear();    }}void dijkstra(){    dis[s] = 0;    int curMin = 0;    while(curMin != INF)    {        int pos;        curMin = INF;        for(int i = 0; i < n; i ++) {            if(!vis[i] && dis[i] < curMin)            {                curMin = dis[i];                pos = i;            }        }        if(curMin == INF) break;        vis[pos] = 1;        for(int i = 0; i != ver[pos].size(); i ++)        {            int v = ver[pos][i].v, w = ver[pos][i].w;            if(!vis[v] && dis[v] > dis[pos] + w) {                dis[v] = dis[pos] + w;            }        }    }}void dijkstra_q(){    priority_queue<Node> pq;    dis[s] = 0;    pq.push(Node(s, 0));    while(!pq.empty())    {        Node cur = pq.top(); pq.pop();        if(vis[cur.v]) continue;        vis[cur.v] = 1;        if(cur.v == e) break;        for(int i = 0; i != ver[cur.v].size(); i ++)        {            int v = ver[cur.v][i].v, w = ver[cur.v][i].w;            if(!vis[v] && dis[v] > dis[cur.v] + w)            {                dis[v] = dis[cur.v] + w;                pq.push(Node(v, dis[v]));            }        }    }}int main(){    int cases; cin >> cases;    for(int curCase = 1; curCase <= cases; curCase ++)    {        cin >> n >> m >> s >> e;        init();        for(int i = 1; i <= m; i ++)        {            int u, v, w;            cin >> u >> v >> w;            ver[u].push_back(Edge(v, w));            ver[v].push_back(Edge(u, w));        }        dijkstra_q();        if(dis[e] == INF) cout << "Case #" << curCase << ": unreachable" << endl;        else    cout << "Case #" << curCase << ": " << dis[e] << endl;    }    return 0;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 舌头上长溃疡怎么办吃什么药 悠悠球不回弹怎么办啊 围棋遇到对方不停围堵怎么办? s围棋业余四段想提升怎么办 wps禁止创建分享链接怎么办 驾驶人开车违章不认可怎么办 京东白条退货分期服务费怎么办 新车年检标丢了怎么办 异地违章罚单丢了怎么办 异地现场违章罚单丢了怎么办 新车没有牌照过停车杆怎么办 驾照换证时间过了怎么办 杭州告知单丢了怎么办 电工证过了复审日期怎么办 大人有居住证小孩没有怎么办 异地补办身份证没有暂住证怎么办 挂科了心里难受怎么办 c1升b2考不过怎么办 b2驾照扣了1分怎么办 红绿色盲驾考怎么办 驾驶证忘带被交警查了怎么办 车子被扣45分怎么办 驾照被扣在外省交警支队怎么办 从渭南把驾照转到西安怎么办 a1a2驾驶证扣3分怎么办 车辆累计扣12分怎么办 驾照扣了40分怎么办 驾驶证扣了30分怎么办 b2驾照逾期未审怎么办 c1实习期扣6分怎么办 车子累计扣30分怎么办 实习期间扣满12分怎么办 新手驾照扣6分怎么办 a2驾驶证逾期未审验怎么办 c1驾照扣了6分怎么办 b1驾照被扣12分怎么办 b2驾驶本扣分了怎么办 驾驶本扣9分后怎么办 b1照扣12分怎么办 b2扣了15分怎么办 b2有扣分未年审怎么办