最短路玄学问题,玄1关
  • 板块学术版
  • 楼主AstaVenti_
  • 当前回复9
  • 已保存回复9
  • 发布时间2024/10/23 18:49
  • 上次更新2024/10/23 20:16:08
查看原帖
最短路玄学问题,玄1关
764773
AstaVenti_楼主2024/10/23 18:49

rt,我在 https://www.luogu.com.cn/discuss/970132 中问到了 vector 最短路写法,以下是我修改后的代码(能正常通过):

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair < int, int > pii;
const int N =1e5 + 5;
int n,m,s,dis[N],vis[N];
vector <pii> g[N];
void dij(int s) {
    priority_queue<pii>q;
    for(int i=0;i<=n;i++)dis[i]=2147483647;
    dis[s]=0,q.push({0,s});
    while(q.size()){
    	pii u=q.top();
		q.pop(),u.first*=-1;
		if(!vis[u.second]){
			vis[u.second]=1;
			for(auto v:g[u.second]){
				if(!vis[v.first]&&dis[v.first]>dis[u.second]+v.second){
					dis[v.first]=dis[u.second]+v.second;
					q.push({-dis[v.first],v.first});
				}
			}
		} 
	}
}
int main() {
    cin>>n>>m>>s;
    for(int i=1,u,v,w;i<=m;i++) {
        cin>>u>>v>>w;
        g[u].push_back({v,w});
    }
    dij(s);
    for(int i=1;i<=n;i++)cout<<dis[i]<<" "; 
}

但是我把栈中 pair<int,int> 两个元素互换位置之后就 WA 了,求问为什么

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair < int, int > pii;
const int N =1e5 + 5;
int n,m,s,dis[N],vis[N];
vector <pii> g[N];
void dij(int s) {
    priority_queue<pii>q;
    for(int i=0;i<=n;i++)dis[i]=2147483647;
    dis[s]=0,q.push({s,0});
    while(q.size()){
    	pii u=q.top();
    	q.pop(),u.second*=-1;
    	if(!vis[u.first]){
    		vis[u.first]=1;
    		for(auto v:g[u.first]){
    			if(!vis[v.first]&&dis[v.first]>dis[u.first]+v.second){
    				dis[v.first]=dis[u.first]+v.second;
    				q.push({v.first,-dis[v.first]});
				}
			}
		}
	}
}
int main() {
    cin>>n>>m>>s;
    for(int i=1,u,v,w;i<=m;i++) {
        cin>>u>>v>>w;
        g[u].push_back({v,w});
    }
    dij(s);
    for(int i=1;i<=n;i++)cout<<dis[i]<<" "; 
}
2024/10/23 18:49
加载中...