Dijkstra Template

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]));
            }
        }
    }
}

 

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324574710&siteId=291194637