图论-最短路

dijkstra(堆优化版):参加大会

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
#define inf 0x3f3f3f3f//1e9级别且2倍仍在int范围内 
typedef pair<int,int> PII;
vector<PII>e[N];
int dis[N];
int vis[N];//缩短时间复杂度,一个点可能放进队列好几次
void dj(int s)
{
	memset(dis,inf,sizeof(dis));
	priority_queue<PII,vector<PII>,greater<PII>>q;
	q.push({0,s});
	dis[s]=0;
	while(q.size())
	{
		auto [w,id]=q.top();q.pop();
        if(vis[id])continue;
        vis[id]=1;
		for(auto [a,b]:e[id]){
			if(dis[id]+a<dis[b]){
				dis[b]=dis[id]+a;
				q.push({dis[b],b});
			}
		}
	}
}
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=0;i<m;i++)
	{
		int u,v,w;
		cin>>u>>v>>w;
		e[u].push_back({w,v});
	}
	dj(1);//单源
    if(vis[n]==0)cout<<-1<<'\n';//到不了
	else cout<<dis[n]<<'\n';//结点1到结点n的最短路
	return 0;
}

Floyd:逛公园

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=2000;
int dis[N][N];
#define inf 0x3f3f3f3f
int main()
{
    int n,m;
    cin>>n>>m;
    memset(dis,inf,sizeof(dis));
    for(int i=0;i<m;i++){
        int u,v,w;
        cin>>u>>v>>w;
        dis[u][v]=dis[v][u]=w;
    }
    //floyd
    for(int k=1;k<=n;k++){//k在第一层
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(dis[i][j]>dis[i][k]+dis[j][k])
                    dis[i][j]=dis[i][k]+dis[j][k];
                    dis[j][i]=dis[i][j];//易忘
            }
        }
    }
    int q;
    cin>>q;
    while(q--){
        int a,b;
        cin>>a>>b;
        if(dis[a][b]>1e8)cout<<-1<<'\n';
        else cout<<dis[a][b]<<'\n';
    }
}
posted @ 2026-01-23 18:37  spark_of_fire  阅读(0)  评论(0)    收藏  举报