时间复杂度为mlogn
#include
#include
#include
#include
using namespace std;
const int N=1000;
const int INF = 0x3f3f3f3f;
struct node
{
int to;
int v;
node(int t, int o) :to(t), v(o) {}
};
struct cmp {
bool operator()(node a, node b)
{
return a.v > b.v;
}
};
vector vec[N];
int dis[N];
int vis[N];
int n, m;
void Prim(int x)
{
priority_queue<node, vector, cmp> que;
memset(dis, INF, N);
memset(vis, 0, N);
dis[x] = 0;
que.push(node(x, 0));
while (!que.empty())
{
node tt = que.top();
que.pop();
int qq = tt.to;
if (vis[qq] == 1)
{
continue;
}
vis[qq] = 1;
for (int i = 0; i < vec[qq].size(); i++)
{
node t = vec[qq][i];
if (t.v!=0 && dis[t.to] > dis[qq]+t.v)
{
dis[t.to] = dis[qq] + t.v;
que.push(node(t.to,dis[t.to]));
}
}
}
}
int main()
{
int ss, ee;
cin >> n >> m>>ss>>ee;
for (int i = 1; i <= n; i++)
{
vec[i].clear();
}
for (int i = 0; i < m; i++)
{
int a, b, c;
cin >> a >> b >> c;
vec[a].push_back(node(b, c));
vec[b].push_back(node(a, c));
}
Prim(ss);
cout << dis[ee] << endl;
}