非正解tj-DJ
2026-10-29 16:34:01
发布于:广东
8阅读
0回复
0点赞
我不明白,为啥不能用dj?
只是dj上加个spfa的判断就过了
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=3e5+10;
ll n,m,s,cnt,head[N],d[N],dd[N];
ll mx=(1<<31)-1;
struct lsqxx{
int v,w,nxt;
}l[2*N];
void add(int u,int v,int w){
cnt++;
l[cnt].v=v;
l[cnt].w=w;
l[cnt].nxt=head[u];
head[u]=cnt;
}
void dj(ll s){
priority_queue<pair<ll,ll>,vector<pair<ll,ll>>,greater<pair<ll,ll>>>q;
q.push({0,s});d[s]=0;
while(q.size()){
pair<ll,ll>p=q.top();q.pop();
ll u=p.second,di=p.first;
if(di!=d[u])continue;
dd[u]++;
if(dd[u]>=4*n){
cout<<"no solution";
exit(0);
}
for(int i=head[u];i!=0;i=l[i].nxt){
ll v=l[i].v,w=l[i].w;
if(d[v]>di+w){
d[v]=di+w;
q.push({d[v],v});
}
}
}
}
int main(){
cin>>n>>m>>s;
for(int i=1;i<=m;i++){
ll u,v,w;
cin>>u>>v>>w;
add(u,v,w);
}
for(int i=1;i<=n;i++)d[i]=mx;dj(s);
for(int i=1;i<=n;i++){
if(d[i]==mx)cout<<-1<<" ";
else cout<<d[i]<<" ";
}
return 0;
}
正解:spfa
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=3e5+10;
ll n,m,s,cnt,head[N];
ll dd[N],d[N],inq[N];
ll mx=(1<<31)-1;
struct lsqxx{
int v,w,nxt;
}l[2*N];
void add(int u,int v,int w){
cnt++;
l[cnt].v=v;
l[cnt].w=w;
l[cnt].nxt=head[u];
head[u]=cnt;
}
void spfa(ll s){
queue<int>q;q.push(s);
inq[s]=1;d[s]=0;
while(q.size()){
ll u=q.front();q.pop();
inq[u]=0;dd[u]++;
if(dd[u]>=n){
cout<<"no solution";
exit(0);
}
for(int i=head[u];i!=0;i=l[i].nxt){
ll v=l[i].v,w=l[i].w;
if(d[u]+w<d[v]){
d[v]=d[u]+w;
if(inq[v]==0){
q.push(v);
inq[v]=1;
}
}
}
}
}
int main(){
cin>>n>>m>>s;
for(int i=1;i<=m;i++){
ll u,v,w;
cin>>u>>v>>w;
add(u,v,w);
}
for(int i=1;i<=n;i++)d[i]=mx;
spfa(s);
for(int i=1;i<=n;i++){
if(d[i]==mx)cout<<-1<<" ";
else cout<<d[i]<<" ";
}
return 0;
}
全部评论 1
有hack,我改一下
1周前 来自 广东
0







有帮助,赞一个