struct Node
{
int v;
int dis;
};
vector<Node> adj[maxv]; //图的邻接表
int n; //n为顶点数
int d[maxv]; //从起点到各点的最短路径长度
bool Bellman(int s)
{
fill(d,d+maxv,inf);
d[s]=0;
//求数组d
for(int i=0;i<n-1;i++) //最多n-1轮,每轮确定一层
{
for(int u=0;u<n;u++) //每轮都遍历所有边
{
for(int j=0;j<adj[u].size();j++)
{
int v=adj[u][j].v;
int dis=adj[u][j].dis;
if(d[u]+dis<d[v])
{
d[v]=d[u]+dis;
}
}
}
}
//判断负环
for(int u=0;u<n;u++)
{
for(int j=0;j<adj[u].size();j++)
{
int v=adj[u][j].v;
int dis=adj[u][j].dis;
if(d[u]+dis<d[v])
{
return false;
}
}
}
return true;
}