kuangbin最短路 模板

kuangbin最短路 模板

//floyd
//复杂度O(N^2)
#include<iostream>
#include<cstdio>

using namespace std;

const int INF=0x3f3f3f3f;
const int MAXN=1e3+50;

int mapp[MAXN][MAXN];
int N,M;

int main()
{
	scanf("%d%d",&N,&M);
	for(int i=1;i<=N;i++){
		for(int j=1;j<=M;j++){
			if(i==j){
				mapp[i][j]=0;
			}else{
				mapp[i][j]=INF;
			}
		}
	}
	int u,v,w;
	for(int i=1;i<=M;i++){
		scanf("%d%d%d",&u,&v,&w);
		mapp[u][v]=w;
	}
	for(int k=1;k<=N;k++){
		for(int i=1;i<=N;i++){
			for(int j=1;j<=N;j++){
				if(mapp[i][j]>mapp[i][k]+mapp[k][j]){
					mapp[i][j]=mapp[i][k]+mapp[k][j];
				}
			}
		}
	}
	for(int i=1;i<=N;i++){
		for(int j=1;j<=N;j++){
			printf("%10d",mapp[i][j]);
		}
		printf("\n");
	}
	return 0;
}

 

//Dijkstra单源最短路+路径输出
//邻接矩阵复杂度O(N^2)
#include<iostream>
#include<cstdio>
#include<algorithm>
 
using namespace std;
 
const int maxn=1010;
 
const int inf=0x3f3f3f3f;
 
int cost[maxn][maxn];
int lowcost[maxn];
bool vis[maxn];
int pre[maxn];
int n,m,beg;
 
void dijkstra()
{
    for(int i=0;i<n;i++){
        lowcost[i]=inf;
        vis[i]=false;
        pre[i]=-1;
    }
    lowcost[beg]=0;
    for(int j=0;j<n;j++){
        int k=-1;
        int Min=inf;
        for(int i=0;i<n;i++){
            if(!vis[i]&&lowcost[i]<Min){
                Min=lowcost[i];
                k=i;
            }
        }
        if(k==-1){
            break;
        }
        vis[k]=true;
        for(int i=0;i<n;i++){
            if(!vis[i]&&lowcost[k]+cost[k][i]<lowcost[i]){
                lowcost[i]=lowcost[k]+cost[k][i];
                pre[i]=k;
            }
        }
    }
}
 
int main()
{
    scanf("%d%d",&n,&m);
    int a,b,c;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(i!=j){
                cost[i][j]=inf;
            }
        }
    }
    for(int i=0;i<m;i++){
        scanf("%d%d%d",&a,&b,&c);
        cost[a][b]=c;
        cost[b][a]=c;
    }
    beg=0;
    dijkstra();
    for(int i=0;i<n;i++){
        cout<<lowcost[i]<<" ";
    }
    cout<<endl;
    int node=n-1;
    cout<<node<<" ";
    while(pre[node]!=-1){
        cout<<pre[node]<<" ";
        node=pre[node];
    }
    cout<<endl;
    return 0;
}

 

//Dijkstra+堆优化
//邻接表复杂度(eloge)
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<queue>

using namespace std;

const int INF=0x3f3f3f3f;
const int MAXN=1000010;

struct qnode{
    int v,c;
    qnode(int _v=0,int _c=0):v(_v),c(_c){}
    friend bool operator < (qnode a,qnode b){
        return a.c>b.c;
    }
};

struct edge{
    int v,cost;
    edge(int _v=0,int _cost=0):v(_v),cost(_cost){}
};
vector<edge>E[MAXN];

void add_edge(int u,int v,int w)
{
    E[u].push_back(edge(v,w));
}

int N,M;
bool vis[MAXN];
int dist[MAXN];

void Dijkstra(int n,int start)
{
    memset(vis,false,sizeof(vis));
    for(int i=1;i<=n;i++){
        dist[i]=INF;
    }
    priority_queue<qnode>que;
    while(!que.empty()){
        que.pop();
    }
    dist[start]=0;
    que.push(qnode(start,0));
    qnode tmp;
    while(!que.empty()){
        tmp=que.top();
        que.pop();
        int u=tmp.v;
        if(vis[u]){
            continue;
        }
        vis[u]=true;
        for(int i=0;i<E[u].size();i++){
            int v=E[tmp.v][i].v;
            int cost=E[u][i].cost;
            if(!vis[v]&&dist[v]>dist[u]+cost){
                dist[v]=dist[u]+cost;
                que.push(qnode(v,dist[v]));
            }
        }
    }
}

int main()
{
    scanf("%d%d",&N,&M);
    int u,v,w;
    for(int i=0;i<M;i++){
        scanf("%d%d%d",&u,&v,&w);
        add_edge(u,v,w);
    }
    Dijkstra(N,1);
    for(int i=1;i<=N;i++){
        cout<<dist[i]<<" ";
    }
    cout<<endl;
    return 0;
}

 

//Dijkstra+堆优化
//邻接表复杂度(eloge)
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<queue>

using namespace std;

const int INF=0x3f3f3f3f;
const int MAXN=1000010;

struct qnode{
    int v,c;
    qnode(int _v=0,int _c=0):v(_v),c(_c){}
    friend bool operator < (qnode a,qnode b){
        return a.c>b.c;
    }
};

struct edge{
    int v,cost;
    edge(int _v=0,int _cost=0):v(_v),cost(_cost){}
};
vector<edge>E[MAXN];

void add_edge(int u,int v,int w)
{
    E[u].push_back(edge(v,w));
}

int N,M;
bool vis[MAXN];
int dist[MAXN];

void Dijkstra(int n,int start)
{
    memset(vis,false,sizeof(vis));
    for(int i=1;i<=n;i++){
        dist[i]=INF;
    }
    priority_queue<qnode>que;
    while(!que.empty()){
        que.pop();
    }
    dist[start]=0;
    que.push(qnode(start,0));
    qnode tmp;
    while(!que.empty()){
        tmp=que.top();
        que.pop();
        int u=tmp.v;
        if(vis[u]){
            continue;
        }
        vis[u]=true;
        for(int i=0;i<E[u].size();i++){
            int v=E[tmp.v][i].v;
            int cost=E[u][i].cost;
            if(!vis[v]&&dist[v]>dist[u]+cost){
                dist[v]=dist[u]+cost;
                que.push(qnode(v,dist[v]));
            }
        }
    }
}

int main()
{
    scanf("%d%d",&N,&M);
    int u,v,w;
    for(int i=0;i<M;i++){
        scanf("%d%d%d",&u,&v,&w);
        add_edge(u,v,w);
    }
    Dijkstra(N,1);
    for(int i=1;i<=N;i++){
        cout<<dist[i]<<" ";
    }
    cout<<endl;
    return 0;
}

 

//spafa
//复杂度O(KE)
#include<iostream>
#include<cstdio>
#include<queue>
#include<queue>
#include<cstring>

using namespace std;

const int MAXN=1010;
const int INF=0x3f3f3f3f;

struct edge{
    int v,cost;
    edge(int _v,int _cost):v(_v),cost(_cost){}
};
vector<edge>E[MAXN];

void add_edge(int u,int v,int w)
{
    E[u].push_back(edge(v,w));
}

bool vis[MAXN];
int cnt[MAXN];
int dist[MAXN];

bool spfa(int start,int n)
{
    memset(vis,false,sizeof(vis));
    for(int i=1;i<=n;i++){
        dist[i]=INF;
    }
    vis[start]=true;
    dist[start]=0;
    queue<int>que;
    while(!que.empty()){
        que.pop();
    }
    que.push(start);
    memset(cnt,0,sizeof(cnt));
    cnt[start]=1;
    while(!que.empty()){
        int u=que.front();
        que.pop();
        vis[u]=false;
        for(int i=0;i<E[u].size();i++){
            int v=E[u][i].v;
            if(dist[v]>dist[u]+E[u][i].cost){
                dist[v]=dist[u]+E[u][i].cost;
                if(!vis[v]){
                    vis[v]=true;
                    que.push(v);
                    if(++cnt[v]>n){
                        return false;
                    }
                }
            }
        }
    }
    return true;
}

int main()
{

    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值