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;
}
如果可以的话,有大佬可以帮我解答一下两个程序有什么区别吗