dij数组版本
int g[200][200],dist[200],visit[200];
int vertex,pos,minn;
void dij(int s){
for(int i=0;i<vertex;i++)dist[i]=100000;
memset(visit,0,sizeof(visit));
for(int i=0;i<vertex;i++)dist[i]=g[s][i];
visit[s]=1;dist[s]=0;
for(int i=1;i<vertex;i++){
minn = 100000;
pos = -1;
for(int j=0;j<vertex;j++){
if(!visit[j]&&dist[j]<minn){
minn = dist[j];
pos = j;
}
}
if(pos == -1)break;
visit[pos] = 1;
for(int j=0;j<vertex;j++){
if(!visit[j]&&dist[j] > dist[pos]+g[pos][j])
dist[j] = dist[pos] + g[pos][j];
}
}
}
Dij优先队列优化版本
int vertex,eid,x,p[100];
struct edge{
int u,v,w,next;
}e[100];
void insert1(int u,int v,int w){
e[eid].u = u;
e[eid].v = v;
e[eid].w = w;
e[eid].next = p[u];
p[u] = eid++;
}
void insert2(int u,int v,int w){
insert1(u,v,w);
insert2(v,u,w);
}
typedef pair<int,int> pii;
void dij(int s){
int dist[100],visit[100];
for(int i=0;i<vertex;i++)dist[i]=100000,visit[i]=0;
priority_queue<pii> que;
que.push(make_pair(0,p[s]));
visit[p[s]]=1;dist[p[s]]=0;
while(que.size()){
pii v = que.top();
int pos = v.second;
que.pop();
for(int i=p[pos];i!=-1;i=e[i].next){
x = e[i].v;
if(!visit[x]&&dist[x]>dist[pos] + e[i].w){
dist[x] = dist[pos]+e[i].w;
que.push(make_pair(dist[x],x));
}
}
}
}
Dij链式星版本
#define MAX_N 10000
int p[MAX_N];
int eid,x,vertex;
struct edge{
int u,v,w,next;
}e[MAX_N];
void insert1(int u,int v,int w){
e[eid].u = u;
e[eid].v = v;
e[eid].w = w;
e[eid].next = p[u];
p[u] = eid++;
}
void insert2(int u,int v,int w){
insert1(u,v,w);
insert1(v,u,w);
}
typedef pair<int,int> pii;
set<pii,less<pii> > min_heap;
set<pii>::iterator iter;
void dij(int s){
int visit[1000],dist[1000];
memset(visit,0,sizeof(visit));
for(int i=0;i<vertex;i++)dist[i] = 100000;
min_heap.insert(make_pair(0,p[s]));dist[p[s]]=0;
for(int i=1;i<vertex;i++){
if(min_heap.size()==0)break;
iter = min_heap.begin();
int pos = iter->second;
min_heap.erase(*iter);
visit[pos] = 1;
for(int j=p[pos];j!=-1;j=e[j].next){
x = e[j].v;
if(!visit[x]&&dist[x] > dist[pos]+e[j].w){
min_heap.erase(make_pair(dist[x],x));
dist[x] = dist[pos] + e[j].w;
min_heap.insert(make_pair(dist[x],x));
}
}
}
}