dij堆优化,请问为什么RE了?
查看原帖
dij堆优化,请问为什么RE了?
275373
Mayoker楼主2022/8/28 10:30

rt,在做本题时我先打了一遍dij堆优化(样例AC,在洛谷在线IDE上调试也没问题,交上去全RE)

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e4+10,M=2e5+10,maxx=1e9;
struct node{
	int u,v,w,next;
}e[2][M];

int head[2][N],cnt[2];
int n,m,s;
int dis[2][N],st[N];

int add(int p,int x,int y,int z){
	e[p][++cnt[p]].u=x;
	e[p][cnt[p]].v=y;
	e[p][cnt[p]].w=z;
	e[p][cnt[p]].next=head[p][x];
	head[p][x]=cnt[p];
}

void dij(int p,int s){
	priority_queue <pair<int ,int > > q;
	for(int i=1;i<=n;i++) dis[p][i]=maxx,st[i]=0;
	dis[p][s]=0;
	q.push(make_pair(0,s));
	
	while(q.size()){
		int x=q.top().second;q.pop();
		if(st[x]) continue;
		st[x]=1;
		
		for(int i=head[p][x];i;i=e[p][i].next){
			int v=e[p][i].v,w=e[p][i].w;
			if(dis[p][v]>dis[p][x]+w){
				dis[p][v]=dis[p][x]+w;
				q.push(make_pair(-dis[p][v],v));
			}
		}
	}
}

int main(){
	
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	
	cin>>n>>m>>s;
	for(int i=1;i<=m;i++){
		int x,y,z;
		cin>>x>>y>>z;
		add(0,x,y,z);
		add(1,y,x,z);
	}
	
	dij(0,s);
	dij(1,s);
	
	int ans=0;
	for(int i=1;i<=n;i++){
		if(dis[0][i]==maxx||dis[1][i]==maxx) continue;
		ans=max(ans,dis[0][i]+dis[1][i]);
	}
	
	cout<<ans;
	return 0;
}

在多次debug无果后,我一气之下P1629 邮递员送信我的AC代码复制了过来,并作了些许的改动,交了上去

(因为这两道题做题思路基本一样,而且改动的地方也只是适应本题的输入输出)

结果把这道题A了(

请问问题出在哪里???

附上改过的代码:

#include<iostream>
#include<queue>
using namespace std;
typedef long long ll;
const int N=6e5+10,maxx=1e12;
struct node{
	int u,v,w,next;
}e[2][N];

int n,m;
int head[2][N],cnt=0,cnt1=0;
int st[N],dis[2][N];

void add0(int x,int y,int z){
	//cnt=-num;
	e[0][++cnt].u=x;
	e[0][cnt].v=y;
	e[0][cnt].w=z;
	e[0][cnt].next=head[0][x];
	head[0][x]=cnt;
}

void add1(int x,int y,int z){
	//cnt=-num;
	e[1][++cnt1].u=x;
	e[1][cnt1].v=y;
	e[1][cnt1].w=z;
	e[1][cnt1].next=head[1][x];
	head[1][x]=cnt1;
}

void dij(int p,int s){
	priority_queue <pair<int ,int > > q;
	for(int i=1;i<=n;i++) dis[p][i]=maxx,st[i]=0;
	dis[p][s]=0;
	q.push(make_pair(0,s));
	
	while(q.size()){
		int x=q.top().second;q.pop();
		if(st[x]) continue;
		st[x]=1;
		
		for(int i=head[p][x];i;i=e[p][i].next){
			int v=e[p][i].v,w=e[p][i].w;
			if(dis[p][v]>dis[p][x]+w){
				dis[p][v]=dis[p][x]+w;
				q.push(make_pair(-dis[p][v],v));
			}
		}
	}
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	
	int s;
	cin>>n>>m>>s;
	for(int i=1;i<=m;i++){
		int x,y,z;
		cin>>x>>y>>z;
		add0(x,y,z);
		add1(y,x,z);
	}
	
	dij(0,s);
	dij(1,s);
	
	int ans=0;
	
	for(int i=1;i<=n;i++) 	
		ans=max(ans,dis[0][i]+dis[1][i]);
	
	cout<<ans;
	
	return 0;
}

如果可以的话,有大佬可以帮我解答一下两个程序有什么区别吗

2022/8/28 10:30
加载中...