#include#include using namespace std; const int M = 1000; int n,m; class Edge { public://从u点到v点的距离为weight int u; int v; int weight; }; class point { public: int fa;//前驱节点 int dis;//源点到这个点的最短路径上限,因为bellman-ford的松弛操作,可以将其称之为最短路径上限,m次松弛操作后dis就是准确的最短路径 }; Edge edge [M]; point V[M]; void Initialize_Single_Source(int s) { for(int i=1;i<=n;i++){ //初始化,刚开始的每个点的dis都为正无穷,表示源点和其不相连 //经过不断的松弛操作,使dis不断更新 V[i].dis=INT_MAX/2;//防止相加溢出,用INT_MAX/2 V[i].fa=0; } V[s].dis=0; } void relax(int u,int v,int w){ if(V[v].dis>V[u].dis+w){ V[v].dis=V[u].dis+w; V[v].fa=u; } } bool bellman_ford(int s) { Initialize_Single_Source(s); for(int i=1;i<=n-1;i++){ for(int j=1;j<=m;j++){ //对于每个边都要进行一次松弛,n个点,进行n-1次,每次至少确定一个最短边 relax(edge[j].u,edge[j].v,edge[j].weight); } } for(int j=1;j<=m;j++){ if(V[edge[j].v].dis>V[edge[j].u].dis+edge[j].weight){ return false; } } return true; } int main() { cin>>n>>m;//n个点m条边 for(int i=1;i<=m;i++){ cin >>edge[i].u >>edge[i].v >>edge[i].weight; } bellman_ford(1); //第一个点到最后一个点的距离 cout<



