Запрос относительно Bellman Ford

В последнее время я изучал алгоритм Беллмана Форда. У меня есть сомнения, что если отрицательный весовой цикл в ориентированном графе доступен из исходной вершины, то кратчайший не существует для всех узлов или для некоторых узлов. Это моя реализация 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;
}

-2

Решение

Ну, 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] после этого цикла, затем есть отрицательный цикл.
Если это был твой вопрос, значит, ты был не на том форуме.
Мои объяснения работают только, если ваш код является правильной реализацией.

0

Другие решения

Других решений пока нет …