1. 程式人生 > >求解單源最短路(Floyd&&Dijstra&&BellmanFord模板)

求解單源最短路(Floyd&&Dijstra&&BellmanFord模板)

讀入的時候注意有重邊的情況 if(e[a][b]>x) e[a][b]=e[b][a]=x (x是邊權,e是鄰接矩陣,a、b是邊的起點和終點,假設是無向圖)

Floyd(不能解決負環):

void init()
{
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            if(i==j) e[i][j]=0;
            else e[i][j]=inf;
        }
}

void floyd()
{
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
            {
                if(e[i][k]<inf&&e[k][j]<inf)
                    if(e[i][j]>e[i][k]+e[k][j]) e[i][j]=e[i][k]+e[k][j];
            }
}

Dijkstra(不能解決負權邊):

void init()
{
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
        {
            if(i==j) e[i][j]=0;
            else e[i][j]=inf;
        }
}
 
void dijkstra(int vs)
{
    int u;
    for(int i=0;i<n;i++)
    {
        vis[i]=0;
        dis[i]=e[vs][i];
    }
    dis[vs]=0;
    for(int i=1;i<n;i++)
    {
        int mmin = inf;
        for(int j=0;j<n;j++)
        {
            if(!vis[j]&&dis[j]<mmin)
            {
                mmin=dis[j];
                u=j;
            }
        }
        vis[u]=1;
        for(int j=0;j<n;j++)
        {
            if(!vis[j]&&dis[u]+e[u][j]<dis[j])
            {
                dis[j]=dis[u]+e[u][j];
            }
        }
    }
}

Dijkstra(堆優化):

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<cstdio>
#include<vector>
#include<cctype>
#include<cstring>
#include<utility>
#include<cstdlib>
#include <iomanip>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e3+7;
const int inf = 0x3f3f3f3f;
int n,dis[maxn];

struct node{
    int v,w;
    node(){}
    node(int _v,int _w){v=_v;w=_w;}
    bool operator < (const node &a)const
    {
        if(w==a.w) return v<a.v;
        return w>a.w;
    }
};

vector<node>edge[maxn];

void dijkstra(int vs)
{
    for(int i=0;i<=n;i++)
        dis[i]=inf;
    dis[vs]=0;
    priority_queue<node> q;
    while(!q.empty()) q.pop();
    q.push(node(vs,dis[vs]));
    while(!q.empty())
    {
        node x=q.top();q.pop();
        for(int i=0;i<edge[x.v].size();i++)
        {
            node y=edge[x.v][i];
            if(dis[y.v]>x.w+y.w)
            {
                dis[y.v]=x.w+y.w;
                q.push(node(y.v,dis[y.v]));
            }
        }
    }
    printf("%d\n",dis[n]);
}

int main()
{
    int a,b,c,m;
    while(scanf("%d%d",&n,&m)==2)
    {
        for(int i=0;i<=n;i++)
            edge[i].clear();
        while(m--)
        {
            scanf("%d%d%d",&a,&b,&c);
            edge[a].push_back(node(b,c));
            edge[b].push_back(node(a,c));
        }
        dijkstra(1);
    }
    return 0;
}

Bellman-Ford(可以解決含負權邊的問題):

/**tot是邊的條數,N是點的個數,dis是源點到G中每個點的距離*/
bool bellman_ford()
{
    memset(dis,inf,sizeof(dis));
    dis[1]=0;
    bool flag;
    for(int i=1;i<=N-1;i++)
    {
        flag=true;
        for(int j=0;j<tot;j++)
        {
            if(dis[edge[j].v]>dis[edge[j].u]+edge[j].w)
            {
                dis[edge[j].v]=dis[edge[j].u]+edge[j].w;
                flag=false;
            }
        }
        if(flag) break;
    }
    for(int i=0;i<tot;i++)
    {
        if(dis[edge[i].v]>dis[edge[i].u]+edge[i].w)
            return true;
    }
    return false;
}

相關推薦

求解短路(Floyd&&Dijstra&&BellmanFord模板)

讀入的時候注意有重邊的情況 if(e[a][b]>x) e[a][b]=e[b][a]=x (x是邊權,e是鄰接矩陣,a、b是邊的起點和終點,假設是無向圖) Floyd(不能解決負環): void init() { for(int i=1;i<=n;i

Dijstra短路模板】(裸的,鄰接矩陣)

Dijstra單源最短路【模板】(裸的,鄰接矩陣) 例題:洛谷-熱浪 附:最詳細的講解 程式碼: #include <iostream> #include <cstdio> using namespace std; const int inf =

Til the Cows Come Home(短路)(Dijstra模板題)

Til the Cows Come Home Bessie is out in the field and wants to get back to the barn to get as much sleep as possible before Farmer John wakes he

Floyd演算法求短路(圖,資料結構)

Floyd演算法思路:計算某點到其餘各點的距離,可先求該點到其中一個點的距離,其他各點類似。假設求i點到j點的距離,跳點為空時,最短距離就是i到j的最短距離,跳點為1時,最短距離為D[i][j] = min{D[i][j],D[i][1]+D[1][j]},跳點為1和2時,最短距離為D[i][j]=min{D

hdu 2544 短路問題 dijkstra+堆優化模板

尋找 問題 col .cn 入隊 ron ava iss cto 最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su

迷宮遊戲(短路

style 個人 遊戲 stream cstring ace tin space for 個人心得:對於復雜抽象的算法還是比較模糊,希望以後有待加強。這題就是用dijskrual算法,在算出最短時間的時候進行適當的更改,還是比較模糊。 1459 迷宮遊戲 基準時間限制:1

短路——Dijkstara算法

並且 n) scanf 輸出 -s pre getchar 初始 得到   算法基本思想:每次找到離源點最近的一個頂點,然後以該頂點為中心進行擴展,最終得到源點到其余所有點的最短路徑。   1、將所有的頂點分為兩個部分:已知最短路程的頂點集合P和未知最短路徑的頂點集合Q  

短路-dijkstra的算法

strong com 初始化 csdn ostream 最短距離 長度 main turn 迪傑斯特拉算法用於求解單源最短路問題,能求解出從一個點出發到剩余所有節點的最短距離。 原理: 使用貪心選擇,將全部節點分為兩部分,已經找出最短路徑的點和沒有為找出最短路徑的點,初

POJ-1511 Invitation Cards (短路+逆向)

每一個 一個 nvi names ring 我們 最短路算法 span class <題目鏈接> 題目大意: 有向圖,求從起點1到每個點的最短路然後再回到起點1的最短路之和。 解題分析: 在求每個點到1點的最短路徑時,如果僅僅只是遍歷每個點,對它們每一個都進行一

短路——(Bellman-Ford演算法)超詳細

今天看了一下午的白書的Bellman-Ford演算法,由於能力有限,可能理解不到位。。。。 感覺就是遍歷所有邊更新點,如果有更新的點,繼續遍歷所有邊,直到沒有點更新就退出. #include <iostream> #include <stdio.h> #inc

L - New Game(短路之dijkstra)

Description Eagle Jump公司正在開發一款新的遊戲。Hifumi Takimoto作為其中的員工,獲得了提前試玩的機會。現在她正在試圖通過一個迷宮。 這個迷宮有一些特點。為了方便描述,我們對這個迷宮建立平面直角座標系。迷宮中有兩條平行直線 L1:Ax+By+C1=0,

[HDU2680] Choose the best route [短路]

反向建圖或者超級源點 dijkstra 不知道wa在哪裡 就很恐怖了 UPD:修改之後的程式碼在下邊。 #include<cstdio> #include<iostream> #include<algorithm> #include<cstdli

【CodeForces - 144D】Missile Silos(短路,列舉中間邊,列舉情況可能性)

題幹: A country called Berland consists of n cities, numbered with integer numbers from 1to n. Some of them are connected by bid

藍橋杯短路(java過)&&spfa短路演算法

百度百科上spfa的思路為:動態逼近法:設立一個先進先出的佇列用來儲存待優化的結點,優化時每次取出隊首結點u,並且用u點當前的最短路徑估計值對離開u點所指向的結點v進行鬆弛操作,如果v點的最短路徑估計值有所調整,且v點不在當前的佇列中,就將v點放入隊尾。這樣不斷從佇列中取出結點來進行鬆弛

Dijkstra 短路(一)

#include<iostream> #include <cstring> #define INF 0x3f3f3f3f #define MAX_N 10001 using namespace std; int g[MAX_N][MAX_N]; int dist[MAX_N]

Dijkstra 短路(三)

#include<iostream> #include<algorithm> #include<cstdio> #include<cstdlib> #include<cstring> #include<vector> #incl

Dijkstra 短路(二)

#include <iostream> #include<iomanip> #include<cstring> using namespace std; const int MAX =1000; const int INF =0x3f3f3f; int m,n;

短路(dijkstra)模板

#include<stdio.h> #include<algorithm> #include<iostream> #include<string.h> const int inf = 9999999; int minn,flag; int main(v

短路+Floyd真香【洛谷P1119】

傳送門:https://www.luogu.org/problemnew/show/P1119 我:這什麼辣雞演算法啊,O(n^3)能用?敲dijkstra啊! 我:?TLE??? :寫個Floyd啊! 我:我才不寫這個垃圾O(n^3) 評測雞:Accepted! 我:哎呦真

PAT (Advanced Level) Practice 1030 Travel Plan (30 分)短路變式

A traveler's map gives the distances between cities along the highways, together with the cost of each highway. Now you are supposed to write a progra