情况:
问题1:Bellmanford算法第3个点WA(我知道这题Bellmanford和普通Dijkstra会超时,但我搞不懂为什么会有WA的情况)
问题2:Dijkstra在那本应该显示TLE的3个点上显示MLE,这是什么意思
代码1(Bellmanford):
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=10001;
const ll INF=1e9;
ll n,m,s,d[N];
vector<ll> to[N],w[N];
void Bellmanford(){
fill(d,d+n+1,INF);
d[s]=0;
for(ll k=1;k<=n-1;k++)
for(ll u=1;u<=n;u++)
for(ll i=0;i<to[u].size();i++){
ll v=to[u][i];
ll cost=w[u][i];
d[v]=min(d[v],d[u]+cost);
}
}
int main(){
scanf("%lld%lld%lld",&n,&m,&s);
for(ll i=1;i<=m;i++){
ll u,v,cost;
scanf("%lld%lld%lld",&u,&v,&cost);
to[u].push_back(v);
w[u].push_back(cost);
}
Bellmanford();
for(ll i=1;i<=n;i++)
printf("%lld ",d[i]);
return 0;
}
代码2:(Dijkstra)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=10001;
const ll INF=1e12;
ll n,m,s,d[N],w[N][N];
bool ok[N];
void Dijkstra(){
fill(d,d+n+5,INF);
d[s]=0;
for(ll k=1;k<=n;k++){
ll u=n+1;
for(ll v=1;v<=n;v++)
if(!ok[v]&&d[v]<d[u]) u=v;
if(u==n+1) break;
ok[u]=1;
for(ll v=1;v<=n;v++)
if(w[u][v]<INF)
d[v]=min(d[v],d[u]+w[u][v]);
}
}
int main(){
scanf("%lld%lld%lld",&n,&m,&s);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
w[i][j]=INF;
for(ll i=1;i<=m;i++){
ll u,v,cost;
scanf("%lld%lld%lld",&u,&v,&cost);
w[u][v]=min(w[u][v],cost);
}
Dijkstra();
for(ll i=1;i<=n;i++)
d[i]<INF?printf("%lld ",d[i]):printf("2147483647 ");
return 0;
}