什么跟什么就是刘汝佳小白书迪杰斯特拉队列的优先队列法
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
typedef pair<int,int> pii;
vector<pair<int,int> >g[10010];
bool vis[10010];
int cost[10010];
int dist[10010];
int n,m;
priority_queue<pii,vector<pii>,greater<pii> > q;
void dij()
{
for(int i=1;i<=n;i++)
dist[i]=INF;
dist[1]=0;
cost[1]=0;
q.push(make_pair(dist[1],1));
while(!q.empty())
{
pii t=q.top();
q.pop();
int v=t.second;
if(vis[v]) continue;
vis[v]=1;
for(int i=0;i<g[v].size();i++)
{
int u=g[v][i].first;
int c=g[v][i].second;
if(dist[v]+c<dist[u])
{
dist[u]=dist[v]+c;
cost[u]=c;
q.push(make_pair(dist[u],u));
}
if(dist[v]+c==dist[u])
{
cost[u]=min(cost[u],c);
}
}
}
}
int main()
{
int u,v,w;
cin>>n>>m;
for(int i=0;i<m;i++)
{
cin>>u>>v>>w;
g[u].push_back(make_pair(v,w));
g[v].push_back(make_pair(u,w));
}
dij();
long long ans=0;
for(int i=1;i<=n;i++)
ans+=cost[i];
cout<<ans<<endl;
}