//一共n条边struct node{//表示每条边s->e:vint s, e, v;node(int a,int b,int c){
s = a, e = b, v = c;}};
vector<node> g;int dis[N];//起点U到各点的距离,初始化为无穷boolbellman_ford(int u){//起点umemset(dis,0x3f3f3f3f,sizeof(dis));
dis[u]=0;//n-1次操作bool flag;for(int i =1; i <= n; i++){
flag =false;//一次扫描所有边都没有松弛,下一次照样不会 可以提前结束循环for(int j =0; j < g.size(); j++){int s = g[j].s;int e = g[j].e;int v = g[j].v;if(dis[e]> dis[s]+ v){
dis[e]= dis[s]+ v;
flag =true;}}if(!flag)returnfalse;//不存在负环}return flag;}
2,SPFA(bellman_ford的优化)
struct node{int e, v;//邻接矩阵 edge[s] s->e : vnode(int b,int c){
e = b, v = c;}};constint inf =0x3f3f3f3f;
vector<node> edge[1000];int n;int dis[1000];int num[1000];//用来记录松弛次数bool vis[1000];//标记是否在队列boolSPAF(){memset(num,0,sizeof(num));memset(vis,false,sizeof(vis));memset(dis, inf,sizeof(dis));
dis[1]=0;
vis[1]=true;// num[1] ++;
queue<int> Q;
Q.push(1);while(!Q.empty()){int u = Q.front();//起点入队
Q.pop();
vis[u]=false;for(int i =0; i < edge[u].size(); i++){int e = edge[u][i].e;int v = edge[u][i].v;if(dis[e]> dis[u]+ v){
dis[e]= dis[u]+ v;if(!vis[e]){//队列没有这个点入队
Q.push(e);
vis[e]=true;
num[e]++;//这个点被松弛了一次if(num[e]> n)returntrue;//根据bellman_ford,一共迭代n次,每个点许多被松弛n次 所以当超过n次就会一直松弛下去,即存在负环; }}}}returnfalse;}