В последнее время я изучал алгоритм Беллмана Форда. У меня есть сомнения, что если отрицательный весовой цикл в ориентированном графе доступен из исходной вершины, то кратчайший не существует для всех узлов или для некоторых узлов. Это моя реализация Bellman Ford.
//O(VE)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define sl(n) scanf("%lld",&n)
#define pl(n) printf("%lld",n)
#define MOD 1000000007
#define inf 1e18
#define rep(i,n) for(i=0;i<n;i++)
#define mset(x,v) memset(x, v, sizeof(x))
vector<ll>t,s;
ll nodes, edges;
void bellman_ford(vector<pair<ll,ll> >mp[],ll src){
ll i,j;
for(i=1;i<=nodes;i++){
t[i]=inf;
}
t[src]=0;
vector<pair<ll,ll> > :: iterator it;
for(i=1;i<nodes;i++){//O(nodes-1) times
for(j=1;j<=nodes;j++){//O(edges)
if(t[j]!=inf)
for(it=mp[j].begin();it!=mp[j].end();it++)
t[it->first]=min(t[j]+it->second,t[it->first]);
}
}
bool flag=1;
for(j=1;j<=nodes;j++){//detecting negative cycles
for(it=mp[j].begin();it!=mp[j].end();it++)
if(t[j]+it->second < t[it->first])
{
flag=0;break;
}
}
if(flag==0)
for(j=1;j<=nodes;j++){//assigning all shortest paths to be -inf
t[j]=-inf;
}}int main()
{
ll x, y, wt,i;
sl(nodes);
sl(edges);
vector<pair<ll,ll> >mp[nodes+1];//1 based indexing of nodes
t.resize(nodes+1);
rep(i,edges){
sl(x);sl(y);sl(wt);
mp[x].push_back(make_pair(y,wt));
mp[y].push_back(make_pair(x,wt));
}
ll src;sl(src);
bellman_ford(mp,src);for(i=1;i<=nodes;i++)
cout<<i<<" "<<t[i]<<endl;
}
Ну, AFAIK, нет кратчайшего пути в сети, если сеть содержит отрицательный цикл, потому что он ушел бы в бесконечность.
BellmanFord работает только в том случае, если нет отрицательного цикла и способен найти такой, если он существует.
Ваш C ++ немного страшен, однако. Доказано, что после
for(i=1;i<nodes;i++){//O(nodes-1) times
for(j=1;j<=nodes;j++){//O(edges)
if(t[j]!=inf)
for(it=mp[j].begin();it!=mp[j].end();it++)
t[it->first]=min(t[j]+it->second,t[it->first]);
}
}
Алгоритм завершается, если нет отрицательного цикла (может завершиться раньше).
Если есть ребро с t [j] + it-> second < t [it-> first] после этого цикла, затем есть отрицательный цикл.
Если это был твой вопрос, значит, ты был не на том форуме.
Мои объяснения работают только, если ваш код является правильной реализацией.
Других решений пока нет …