最短路 + 鄰接表 + 堆優化(模板)(Dijkstra + SPFA)


模板已經過題目驗證


最短路模板+鄰接表建圖+堆優化(優先隊列) 複雜度O(Elog(E))

#include<iostream>  
#include<queue>  
#include<vector>  
#include<cstdio>  

using namespace std;  

const int maxn = 100005;   
const int inf = 1<<29;
int dis[maxn];  
int n, m, s;  

struct edge {int to,cost;}; 

vector<edge> G[maxn];  

struct node {  
    int len, v;  
    friend bool operator <(node x, node y) {  
        return x.len > y.len;  
    }  
};  

void Dijkstra() {  
    priority_queue<node> q;  
    fill(d, d+maxn, inf);
    dis[s]=0; node t;  
    t.len=0; t.v=s;  
    q.push(t);  
    while(q.size()) {  
        t = q.top(); q.pop();  
        if(dis[t.v] < t.len) continue;  
        for(int i = 0; i < G[t.v].size(); i++) {  
            edge e = G[t.v][i];  
            if(dis[e.to] > dis[t.v] + e.cost) {  
                dis[e.to] = dis[t.v] + e.cost;  
                node temp = {dis[e.to], e.to};  
                q.push(temp);  
            }  
        }  
    }  
}  
int main() {  
    while(~scanf("%d %d", &n, &m), (n+m)) {  
        for(int i = 0; i <= n; i++) G[i].clear();  
        for(int i = 1; i <= m; i++) {  
            int a, b, w;  
            edge t, rt;  
            scanf("%d %d %d", &a, &b, &w);  
            t.to=b; t.cost=w;  
//            rt.to=a; rt.cost=w;  //雙向 
            G[a].push_back(t);  
//            G[b].push_back(rt);  
        }  
        s = 1; //起點 
        Dijkstra();  
        cout << dis[n] << endl;  
    }  
    return 0;  
}  
//const inline int read() {  //這是快速輸入  用法爲 int a = read();
//  int k=0,f=1;  char c=getchar();
//  for(;!isdigit(c);c=getchar())
//     if(c=='-')   f=-1;
//  for(;isdigit(c);c=getchar())
//     k=k*10+c-'0';
//  return k*f;
//}

最短路模板+鄰接表建圖+SPFA

#include<iostream>  
#include<queue>  
#include<vector>  
#include<cstdio>  

using namespace std;  

const int maxn = 100005;   
const int inf = 1<<29;

struct edge{int to, cost;};  
int dis[maxn], vis[maxn];  

int n, m, s;  
vector<edge> G[maxn];  

void SPFA() {  
    fill(dis, dis+maxn, inf);
    dis[s] = 0;  
    fill(vis, vis+maxn, 0);  
    queue<int> q;  
    q.push(s);  
    while(!q.empty()) {  
        int u = q.front();  
        q.pop();  
        vis[u] = 0;  
        for(int i = 0; i < G[u].size(); i++) {  
            int v=G[u][i].to, len=G[u][i].cost;  
            if(dis[v] > dis[u] + len) {  
                dis[v] = dis[u] + len;  
                if(vis[v] == 0) {  
                    vis[v] = 1;  
                    q.push(v);  
                }  
            }  
        }  
    }  
}  
int main() {  
    while(~scanf("%d %d", &n, &m), (n+m)) {   
        for(int i = 0; i <= n; i++) G[i].clear();  
        for(int i = 0; i < m; i++) {  
            int a, b, w;  
            edge t, rt;  
            scanf("%d %d %d", &a, &b, &w);  
            t.to=b; t.cost=w;  
//            rt.to=a; rt.cost=w;  //雙向 
            G[a].push_back(t);  
//            G[b].push_back(rt);  
        }  
        s = 1;  
        SFPA();  
        cout << dis[n] << endl;  
    }  
    return 0;  
}  
//const inline int read() { //這是快速輸入  用法爲 int a = read();
//  int k=0,f=1;  char c=getchar();
//  for(;!isdigit(c);c=getchar())
//     if(c=='-')   f=-1;
//  for(;isdigit(c);c=getchar())
//     k=k*10+c-'0';
//  return k*f;
//}
發佈了155 篇原創文章 · 獲贊 16 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章