最短路

来源:互联网 发布:淘宝上的面膜是正品吗 编辑:程序博客网 时间:2024/06/05 11:24

1、floyd(邻接矩阵)

#include <iostream>#include <stdio.h>#include <string.h>#include <vector>#include <algorithm>#include <queue>#include <stack>#define MAX 1005using namespace std;const int INF=0x3f3f3f3f;int n,m;int main(){    while(~scanf("%d%d",&n,&m)){        if(n==0)    printf("0\n");        stack<char> s;        while(n){            if(n%m>=10)                s.push('A'+n%m-10);            else                s.push('0'+n%m);            n=n/m;        }        while(!s.empty()){            printf("%c ",s.top());            s.pop();        }        printf("\n");    }    return 0;}

2、dijkstra()(邻接表)

//dijkstra()(邻接表)#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>#include <vector>#define MAX 1005const int INF=0x3f3f3f3f;using namespace std;typedef struct {    int u,v,w;} edge;vector<edge> edges;vector<int> G[MAX];int dis[MAX],book[MAX];int n,m;void dijkstra() {    memset(book,0,sizeof(book));    memset(dis,0x3f,sizeof(dis));dis[1]=0;    while(1) {        int t,minx=INF;        for(int j=1; j<=n; j++)            if(!book[j]&&dis[j]<minx)   minx=dis[t=j];        book[t]=1;        if(minx==INF)break;        for(int j=0; j<(int)G[t].size(); j++) {            edge e=edges[G[t][j]];            dis[e.v]=min(dis[e.v],dis[t]+e.w);        }    }}void init() {    for(int i=0; i<n; i++)G[i].clear();    edges.clear();}void AddEdge(int u,int v,int w) {    edges.push_back(edge{u,v,w});    int m=edges.size();    G[u].push_back(m-1);}int main() {    while(~scanf("%d%d",&n,&m)&&n&&m) {        int u,v,w;        init();        for(int i=0; i<m; i++) {            scanf("%d%d%d",&u,&v,&w);            AddEdge(u,v,w);            AddEdge(v,u,w);        }        dijkstra();        printf("%d\n",dis[n]);    }    return 0;}

3、dijkstra()(邻接表,最小堆优化)

#include <iostream>#include <stdio.h>#include <string.h>#include <vector>#include <algorithm>#include <queue>#define MAX 1005using namespace std;const int INF=0x3f3f3f3f;struct heap{    int w,x;    bool operator<(const heap& h) const{        return w>h.w;    }};typedef struct {    int u,v,w;}edge;vector<edge>edges;vector<int>G[MAX];int n,m;int dis[MAX],book[MAX];void AddEdge(int u,int v,int w){    edges.push_back(edge{u,v,w});    int m=edges.size();    G[u].push_back(m-1);}void dijkstra(){    memset(dis,0x3f,sizeof(dis));dis[1]=0;    memset(book,0,sizeof(book));    priority_queue<heap> q;    q.push(heap{0,1});    while(!q.empty()){        heap h=q.top();        q.pop();        if(book[h.x])   continue;        book[h.x]=1;        for(int i=0;i<G[h.x].size();i++){            edge e=edges[G[h.x][i]];            dis[e.v]=min(dis[e.v],dis[h.x]+e.w);            q.push(heap{dis[e.v],e.v});        }    }}int main(){    while(scanf("%d%d",&n,&m)==2&&n&&m){        for(int i=1;i<=n;i++)   G[i].clear();        edges.clear();        int u,v,w;        for(int i=0;i<m;i++){            scanf("%d%d%d",&u,&v,&w);            AddEdge(u,v,w);            AddEdge(v,u,w);        }        dijkstra();        printf("%d\n",dis[n]);    }    return 0;}

4、//dijkstra()(邻接表,最小堆,打印路径)

//dijkstra()(邻接表,最小堆,打印路径)#include <iostream>#include <stdio.h>#include <string.h>#include <vector>#include <algorithm>#include <queue>#define MAX 1005using namespace std;const int INF=0x3f3f3f3f;struct heap{    int w,x;    bool operator<(const heap& h) const{        return w>h.w;    }};typedef struct {    int u,v,w;}edge;vector<edge>edges;vector<int>G[MAX];int n,m;int dis[MAX],book[MAX];int fa[MAX];void AddEdge(int u,int v,int w){    edges.push_back(edge{u,v,w});    int m=edges.size();    G[u].push_back(m-1);}void dijkstra(){    memset(dis,0x3f,sizeof(dis));dis[1]=0;    memset(book,0,sizeof(book));    priority_queue<heap> q;    q.push(heap{0,1});    while(!q.empty()){        heap h=q.top();        q.pop();        if(book[h.x])   continue;        book[h.x]=1;        for(int i=0;i<(int)G[h.x].size();i++){            edge e=edges[G[h.x][i]];            dis[e.v]=min(dis[e.v],dis[h.x]+e.w);            if(dis[e.v]>dis[h.x]+e.w){                dis[e.v]=dis[h.x]+e.w;                fa[e.v]=h.x;                q.push(heap{dis[e.v],e.v});            }        }    }}void print(int x){    if(x==1){        printf("%d ",x);        return;    }    print(fa[x]);    printf("%d ",x);}int main(){    while(scanf("%d%d",&n,&m)==2&&n&&m){        for(int i=1;i<=n;i++)   G[i].clear();        edges.clear();        int u,v,w;        for(int i=0;i<m;i++){            scanf("%d%d%d",&u,&v,&w);            AddEdge(u,v,w);            AddEdge(v,u,w);        }        dijkstra();        printf("%d\n",dis[n]);        print(n);printf("\n");    }    return 0;}

5、//flyod 打印路径

//flyod 打印路径//#include <iostream>#include <stdio.h>#include <string.h>#include <vector>#include <algorithm>#include <queue>#define MAX 1005using namespace std;const int INF=0x3f3f3f3f;int n,m;int a[MAX][MAX],nex[MAX][MAX];void floyd(){    for(int k=1;k<=n;k++)        for(int i=1;i<=n;i++)            for(int j=1;j<=n;j++){                if(a[i][j]>a[i][k]+a[k][j]){                    a[i][j]=a[i][k]+a[k][j];                    nex[i][j]=nex[i][k];                }        }}void print(int x){    printf("%d ",x);    if(x==n){putchar(10);return;}    print(nex[x][n]);}int main(){    while(scanf("%d%d",&n,&m)==2&&n&&m){        for(int i=1;i<=n;i++)            for(int j=1;j<=n;j++){                if(i==j)    a[i][j]=0;                else a[i][j]=INF;                nex[i][j]=j;            }        for(int i=0;i<m;i++){            int u,v,w;            scanf("%d%d%d",&u,&v,&w);            a[u][v]=w;            a[v][u]=w;        }        floyd();        printf("%d\n",a[1][n]);        print(1);    }    return 0;}
原创粉丝点击