图论-最短路
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';
}
}
浙公网安备 33010602011771号