最短路+最长路+最短路输出路径

1.spfa最短路

#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
const int maxn=1e5+100;
typedef pair<int,int>PII;
vector<PII>e[maxn];
int vis[maxn];
int dis[maxn];
int cnt[maxn];
void spfa(){
    queue<int>q;
    memset(dis,0x3f,sizeof(dis));
    memset(vis,0,sizeof(vis));
    memset(cnt,0,sizeof(cnt));
    dis[1]=0;
    q.push(1);
    vis[1]=1;
    while(!q.empty()){
        int u=q.front();
        q.pop();
        vis[u]=0;
        for(int i=0;i<e[u].size();i++){
            int v=e[u][i].first;
            int w=e[u][i].second;
            if(dis[v]>dis[u]+w){
                dis[v]=dis[u]+w;
                if(!vis[v]){
                    vis[v]=1;
                    q.push(v);
                }
            }
        }
    }
}
int main(){
    int n,m;
    cin>>n>>m;
    int u,v,w;
    for(int i=1;i<=m;i++){
        cin>>u>>v>>w;
        e[u].push_back({v,w});
        e[v].push_back({u,w});
    }
    spfa();
    if(dis[n]==0x3f3f3f3f){
        cout<<"impossible"<<endl;
    }
    else{
        cout<<dis[n]<<endl;
    }
}

/*
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
const int maxn=1e5+100;
typedef pair<int,int>PII;
struct node{
    int to;
    int ne;
    int w;
}e[maxn]; 
int vis[maxn];
int dis[maxn];
int cnt;
int head[maxn];
void add(int u,int v,int w){
    e[cnt].to=v;
    e[cnt].ne=head[u];
    e[cnt].w=w;
    head[u]=cnt++;
}
void spfa(){
    queue<int>q;
    memset(dis,0x3f,sizeof(dis));
    memset(vis,0,sizeof(vis));
    dis[1]=0;
    q.push(1);
    vis[1]=1;
    while(!q.empty()){
        int u=q.front();
        q.pop();
        vis[u]=0;
        for(int i=head[u];~i;i=e[i].ne){
            int v=e[i].to;
            int w=e[i].w;
            if(dis[v]>dis[u]+w){
                dis[v]=dis[u]+w;
                if(!vis[v]){
                    vis[v]=1;
                    q.push(v);
                }
            }
        }
    }
}
int main(){
    int n,m;
    cin>>n>>m;
    int u,v,w;
    memset(head,-1,sizeof(head));
    for(int i=1;i<=m;i++){
        cin>>u>>v>>w;
        add(u,v,w);
        add(v,u,w);
    }
    spfa();
    if(dis[n]==0x3f3f3f3f){
        cout<<"impossible"<<endl;
    }
    else{
        cout<<dis[n]<<endl;
    }
}
*/

2.spfa最长路

其实就是改了一个大于小于号

#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
const int maxn=1e5+100;
typedef pair<int,int>PII;
struct node{
    int to;
    int ne;
    int w;
}e[maxn]; 
int vis[maxn];
int dis[maxn];
int cnt;
int head[maxn];
int n,m;
void add(int u,int v,int w){
    e[cnt].to=v;
    e[cnt].ne=head[u];
    e[cnt].w=w;
    head[u]=cnt++;
}
void spfa(){
    queue<int>q;
    for(int i=1;i<=n;i++){
        dis[i]=-0x3f3f3f3f;
    } 
    memset(vis,0,sizeof(vis));
    dis[1]=0;
    q.push(1);
    vis[1]=1;
    while(!q.empty()){
        int u=q.front();
        q.pop();
        vis[u]=0;
        for(int i=head[u];~i;i=e[i].ne){
            int v=e[i].to;
            int w=e[i].w;
            if(dis[v]<dis[u]+w){
                dis[v]=dis[u]+w;
                if(!vis[v]){
                    vis[v]=1;
                    q.push(v);
                }
            }
        }
    }
}
int main(){
    cin>>n>>m;
    int u,v,w;
    memset(head,-1,sizeof(head));
    for(int i=1;i<=m;i++){
        cin>>u>>v>>w;
        add(u,v,w);
    }
    spfa();
    if(dis[n]==-0x3f3f3f3f){
        cout<<"-1"<<endl;
    }
    else{
        cout<<dis[n]<<endl;
    }
}

最短路输出路径:

 

#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
#include<stack> 
using namespace std;
const int maxn=1e5+100;
typedef pair<int,int>PII;
struct node{
    int to;
    int ne;
    int w;
}e[maxn]; 
int vis[maxn];
int dis[maxn];
int cnt;
int head[maxn];
int pre[maxn];
void add(int u,int v,int w){
    e[cnt].to=v;
    e[cnt].ne=head[u];
    e[cnt].w=w;
    head[u]=cnt++;
}
void spfa(int s){
    queue<int>q;
    memset(pre,-1,sizeof(pre));
    memset(dis,0x3f,sizeof(dis));
    memset(vis,0,sizeof(vis));
    dis[s]=0;
    q.push(s);
    vis[s]=1;
    while(!q.empty()){
        int u=q.front();
        q.pop();
        vis[u]=0;
        for(int i=head[u];~i;i=e[i].ne){
            int v=e[i].to;
            int w=e[i].w;
            if(dis[v]>dis[u]+w){
                dis[v]=dis[u]+w;
                pre[v]=u;
                if(!vis[v]){
                    vis[v]=1;
                    q.push(v);
                }
            }
        }
    }
}
int main(){
    int n,m;
    cin>>n>>m;
    int u,v,w;
    memset(head,-1,sizeof(head));
    for(int i=1;i<=m;i++){
        cin>>u>>v>>w;
        add(u,v,w);
        add(v,u,w);
    }
    int s,e;
    while(cin>>s>>e){
        spfa(s);
        if(dis[e]==0x3f3f3f3f){
            cout<<"impossible"<<endl;
        }
        else{
            cout<<dis[e]<<endl;
        }
        stack<int>path;
        path.push(e);
        int now=pre[e];
        while(1){
            path.push(now);
            if(now==s){
                break;
            }
            now=pre[now];
        }
        printf("从%d到%d最优路线 : %d", s, e, s);
        path.pop();
        while(!path.empty()){
            printf("--->%d",path.top());
            path.pop();
        } 
        printf("\n");
        printf("最小花费:%d\n",dis[e]); 
    }
}

 

posted @ 2021-04-25 22:03  lipu123  阅读(158)  评论(0)    收藏  举报