单源最短路 dijkstra算法模板

链接: 模板题
不能处理带负边权的情况

/*
邻接矩阵存图
1、从源点开始每次选取一个离点集距离最近的点t 添加到集合中
2、利用t点对集合中的点进行松弛操作,进行更新
时间复杂度o(n²)
*/
#include 
#define go continue
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fory(i,a,b) for(int i = a; i <= b; ++i)
#define forl(i,a,b) for(int i = a; i < b; ++i)
using namespace std;

const int N = 1000;
const int inf = 0x3f3f3f3f;

int n, m;
int u, v, w;
int g[N][N];
int dis[N];
bool st[N];

void dijkstra() {
    memset(dis, inf, sizeof dis);
    dis[1] = 0;

    forl(i, 0, n) {
        int t = -1;
        //找到集合最近的点
        fory(j, 1, n) {
            if(!st[j] && (t == -1 || dis[t] > dis[j])) t = j;
        }

        //加入集合
        st[t] = true;

        //利用新加入的点更新其他点的距离
        fory(j, 1, n) dis[j] = min(dis[j], dis[t] + g[t][j]);
    }

    dis[n] == inf ? cout << -1 : cout << dis[n];
}


signed main() {
    IOS;

    cin >> n >> m;

    memset(g, 0x3f, sizeof g);

    forl(i, 0, m) {
        cin >> u >> v >> w;
        g[u][v] = min(g[u][v], w); //处理重边
    }

    dijkstra();

    return 0;
}

你可能感兴趣的:(算法,图论)