//朴素版
#include <bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define fi first
#define se second
#define endl '\n'
#define IOS std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
const int N = 5e5 + 10;
int g[1005][1005], dis[1005], bj[1005];
int n, m, s, t;
bool dji()
{
dis[s] = 0; //将开始的点的距离变成0
for(int i = 1; i <= n; i ++) //n次迭代,完成之后刚好把所有点都松弛了一遍,并放进了标记数组
{
int x = -1;
for(int j = 1; j <= n; j ++)
if(!bj[j] && (x == -1 || dis[x] > dis[j])) // 找到没有被标记过且dis最小的点x
x = j;
bj[x] = 1;
for(int k = 1; k <= n; k ++)
if(dis[k] > dis[x] + g[x][k]) //松弛x连的点
dis[k] = dis[x] + g[x][k];
}
return dis[t] == inf;
}
int main()
{
memset(g, inf, sizeof g); //初始化
memset(dis, inf, sizeof dis); //初始化
cin >> n >> m >> s >> t;
while(m --)
{
int a, b, c;
cin >> a >> b >> c;
g[a][b] = min(g[a][b], c);
g[b][a] = min(g[b][a], c);
}
if(dji())
cout << "-1" << endl;
else
cout << dis[t];
return 0;
}
稠密图的Djikstra(朴素版)
最新推荐文章于 2023-11-03 23:09:26 发布