例题:
https://www.acwing.com/problem/content/description/1131/
1、仅用dis数组记录,出队时记录最小距离
#include<bits/stdc++.h> #define fore(x,y,z) for(LL x=(y);x<=(z);x++) #define forn(x,y,z) for(LL x=(y);x<(z);x++) #define rofe(x,y,z) for(LL x=(y);x>=(z);x--) #define rofn(x,y,z) for(LL x=(y);x>(z);x--) #define pb push_back #define all(x) (x).begin(),(x).end() #define fi first #define se second using namespace std; typedef long long LL; typedef pair<int,int> PII; typedef pair<LL,LL> PLL; int n,m,s,t; vector<int> adj[3000]; vector<int> cost[3000]; int dis[3000]; void Dijkstra() { memset(dis,0x3f,sizeof(dis)); priority_queue<PII,vector<PII>,greater<PII>> que; que.push({0,s}); while(que.size()) { PII dis_u=que.top(); que.pop(); if(dis[dis_u.se]<=dis_u.fi) continue; dis[dis_u.se]=dis_u.fi; if(dis_u.se==t) break; int sz=adj[dis_u.se].size(); for(int i=0;i<sz;i++) { if(dis_u.fi+cost[dis_u.se][i]<dis[adj[dis_u.se][i]]) que.push({dis_u.fi+cost[dis_u.se][i],adj[dis_u.se][i]}); } } } void YD() { cin>>n>>m>>s>>t; while(m--) { int a,b,c;cin>>a>>b>>c; adj[a].push_back(b); cost[a].push_back(c); adj[b].push_back(a); cost[b].push_back(c); } Dijkstra(); cout<<dis[t]<<endl; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int T=1; //cin >> T; while (T--) { YD(); } return 0; }View Code
2、用dis和vis数组记录,入队时更新最小距离,出队时更新vis数组
#include<bits/stdc++.h> #define fore(x,y,z) for(LL x=(y);x<=(z);x++) #define forn(x,y,z) for(LL x=(y);x<(z);x++) #define rofe(x,y,z) for(LL x=(y);x>=(z);x--) #define rofn(x,y,z) for(LL x=(y);x>(z);x--) #define pb push_back #define all(x) (x).begin(),(x).end() #define fi first #define se second using namespace std; typedef long long LL; typedef pair<int,int> PII; typedef pair<LL,LL> PLL; int n,m,s,t; vector<int> adj[3000]; vector<int> cost[3000]; int dis[3000]; bool vis[3000]; void Dijkstra() { memset(dis,0x3f,sizeof(dis)); priority_queue<PII,vector<PII>,greater<PII>> que; que.push({0,s}); dis[s]=0; while(que.size()) { PII dis_u=que.top(); que.pop(); if(vis[dis_u.se]) continue; vis[dis_u.se]=true; if(dis_u.se==t) break; int sz=adj[dis_u.se].size(); for(int i=0;i<sz;i++) { if(dis_u.fi+cost[dis_u.se][i]<dis[adj[dis_u.se][i]]) { dis[adj[dis_u.se][i]]=dis_u.fi+cost[dis_u.se][i]; que.push({dis_u.fi+cost[dis_u.se][i],adj[dis_u.se][i]}); } } } } void YD() { cin>>n>>m>>s>>t; while(m--) { int a,b,c;cin>>a>>b>>c; adj[a].push_back(b); cost[a].push_back(c); adj[b].push_back(a); cost[b].push_back(c); } Dijkstra(); cout<<dis[t]<<endl; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int T=1; //cin >> T; while (T--) { YD(); } return 0; }View Code
疑似第二种更快,第一种更好写
标签:int,写法,back,dijkstra,que,push,dis,优化,define From: https://www.cnblogs.com/ydUESTC/p/16655477.html