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]){ from = 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] = from + edge [and] [j] .d; } } }
Priority queue optimization
const int Ni = 10000; const int INF = 1<<27; struct node{ int x,d; node(){} node(int a,int 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> eg[Ni]; int dis [Ni], n; void Dijkstra(int s) { int i; for(i=0;i<n;i++) dis[i]=INF; dis[s]=0; // optimize with priority queue priority_queue<node> q; q.push(node(s,dis[s])); while(!q.empty()) { node x=q.top();q.pop(); for(i=0;i<eg[x.x].size();i++) { node y=eg[x.x][i]; if(dis[y.x]>x.d+y.d) { dis[yx]=x.d+yd; q.push(node(y.x,dis[y.x])); } } } }