#include <bits/stdc++.h>
using namespace std;
long long n, m, s;
struct Edge
{
long long to,w;
bool operator<(const Edge &s) const
{
return w>s.w;
}
};
bool S[10001];
vector<Edge> G[10001];
long long dis[10001];
long long dijkstra(long long start)
{
priority_queue<Edge> q;
q.push({start, 0});
for(long long i=1;i<=n;i++)
{
dis[i]=INT_MAX;
}
dis[start]=0;
while (q.size()>0)
{
Edge a=q.top();
q.pop();
long long u=a.to;
if(S[u])
{
continue;
}
S[u]=1;
for (int i=0;i<G[u].size();i++)
{
int v = G[u][i].to;
if (S[v] == 0) {
dis[v] = min(dis[v],G[u][i].w+a.w);
q.push({v,dis[v]});
}
}
}
return 0;
}
int main()
{
cin>>n>>m>>s;
for(long long i=0;i<m;i++)
{
long long u,v,w;
cin>>u>>v>>w;
G[u].push_back({v,w});
}
dijkstra(s);
for(long long i=1;i<=n;i++)
{
cout<<dis[i]<<" ";
}
return 0;
}
Prim
#include <bits/stdc++.h>
using namespace std;
int n,m;
int q[5001][5001];
bool visited[5001];
int MST()
{
vector<int> dist(n+1,0x3f3f3f3f);
dist[1]=0;
int mst_sum=0;
for (int i=0;i<n;i++)
{
int u=-1;
int min_dist=0x3f3f3f3f;
for (int j=1;j<=n;j++)
{
if (!visited[j]&&dist[j]<min_dist)
{
min_dist=dist[j];
u=j;
}
}
if(u==-1)
{
return -1;
}
visited[u]=1;
mst_sum+=dist[u];
for (int v=1;v<=n;v++)
{
if (!visited[v]&&q[u][v]<dist[v])
{
dist[v]=q[u][v];
}
}
}
return mst_sum;
}
int main()
{
memset(q, 0x3f, sizeof(q));
cin>>n>>m;
for(int i=0;i<m;i++)
{
int u,v,w;
cin>>u>>v>>w;
q[u][v]=min(q[u][v],w);
q[v][u]=min(q[v][u],w);
}
int ans=MST();
if(ans==-1)
{
cout<<"orz"<<endl;
}
else
{
cout<<ans<<endl;
}
return 0;
}