Dijkstra
struct node
{
long long x,d;
node();
node(long long xx,long long dd){
x = xx;
d = dd;
}
};
vector<node> edge[maxn];
void dijkstra(long long x)
{
long long i,j;
for(i=0;i<n;i++) vis[i] = 0,dis[i] = INF;
dis[x] = 0;
for(i=0;i<n;i++){
long long minn = INF;
long long u = 0;
for(j=0;j<n;j++){
if(!vis[j] && minn > dis[j]){
minn = dis[j];
u = j;
// cout<<"A "<<minn<<" "<<u<<endl;
}
}
vis[u] = 1;
for(j=0;j<edge[u].size();j++){
long long v = edge[u][j].x;
if(!vis[v] && (minn + edge[u][j].d) < dis[v])
dis[v] = minn + edge[u][j].d;
}
}
}
优先队列优化
const int MAXN = 50010; const ll INF = ((ll)1<<62); struct node{ int x; ll d; node(){} node(int a,ll b){x = a;d = b;} bool operator < (const node & a) const { if(d == a.d) return x < a.x; else return d > a.d; } }; vector<node> edge[MAXN]; //记得清边 ll dis[MAXN]; int N; //N从1到N void Dijkstra(int s) { for(int i = 1; i <= N; i++) dis[i] = INF; dis[s] = 0; priority_queue<node> q; q.push(node(s,dis[s])); while(!q.empty()){ node x = q.top(); q.pop(); for(int i = 0;i < edge[x.x].size(); i++){ node y = edge[x.x][i]; if(dis[y.x] > x.d + y.d){ dis[y.x] = x.d + y.d; q.push(node(y.x,dis[y.x])); } } } }