图论-dij

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));
            }
        }
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值