//最短路之spfa算法模板
const int INF = 0x3f3f3f3f;
const int MAX_V = ???;
struct edge { //cost代表一个点到to这个点的权值
int to, cost;
};
int V, M; //顶点数,边数
vector<edge> G[MAX_V]; //G[i]存放的是第i个点到 其他点的序号和权值
int d[MAX_V]; //d[i]存放的是指定节点s到i的最短距离
bool vis[MAX_V]; //vis[i]标记第i个顶点是否在队列
int count ;
void spfa(int s) {
count = 0; //统计循环次数
queue<int > que; //存顶点
fill(d, d+V, INF); //初始化d
fill(vis, vis+V, false);
d[s] = 0;
que.push(s); //把第一个点序号存入
while(!que.empty()) {
int i, v = que.front(); que.pop();
vis[v] = false; //v不在队列中
for(int i = 0;i < G[v].size();i ++){
edge e = G[v][i];
if(d[e.to] > d[v] + e.cost){
d[e.to] = d[v] + e.cost;
if(++ count > V * M) //判断负圈
break;
if(!vis[e.to]){ //如果e.to不在队列中
que.push(e.to);
vis[e.to] = true;
}
}
}
}
}
//注意:如果是多组数据记得遍历顶点用G[i].clear();来清空G[v],否则会影响第二组数据
while(V --) G[V].clear();
if(count > V * M) no answer;