1. 程式人生 > 實用技巧 >圖演算法

圖演算法

最短距離

const int maxn=1010;
const int INF=1000000000;
int n,G[maxn][maxn];
int vis[maxn]={0};
int d[maxn];
void dijkstra(int s){
    fill(d,d+maxn,INF);
    d[s]=0;
    for(int i=0;i<n;i++){
        int u=1,min=INF;
        for(int j=0;j<n;j++){
            if(vis[j]==0&&d[j]<min){
                u=j;
                min=d[j];
            }
        }
        if(u==-1)return;
        vis[u]=1;
        for(int v=0;v<n;v++){
            if(vis[v]==0&&G[u][v]!=INF&&d[u]+G[u][v]<d[v]){
                d[v]=d[u]+G[u][v];
            }
        }
    }
}

最短路徑

const int maxn=1010;
const int INF=1000000000;
int n,G[maxn][maxn];
int vis[maxn]={0};
int d[maxn];
int pre[maxn];
void dijkstra(int s){
    fill(d,d+maxn,INF);
    d[s]=0;
    for(int i=0;i<n;i++){
        pre[i]=i;
    }
    for(int i=0;i<n;i++){
        int u=1,min=INF;
        for(int j=0;j<n;j++){
            if(vis[j]==0&&d[j]<min){
                u=j;
                min=d[j];
            }
        }
        if(u==-1)return;
        vis[u]=1;
        for(int v=0;v<n;v++){
            if(vis[v]==0&&G[u][v]!=INF&&d[u]+G[u][v]<d[v]){
                d[v]=d[u]+G[u][v];
                pre[v]=u;
            }
        }
    }
}