Spfa模板
const int MAXN =1e3+10;
const int INF = 0x3f3f3f3f;
int mapp[MAXN][MAXN];
int dis[MAXN];
bool mark[MAXN];
int num[MAXN];//用于检测负权环
int N;//点的数量
int Spfa(int from){
memset(mark,0,sizeof mark);
memset(dis,INF,sizeof dis);
dis[from] = 0;
mark[from] = true;
queue<int> Q;
Q.push(from);
while(!Q.empty()){
int t = Q.front();
++num[t];
if(num[t]>N)return -1;//返回负一代表存在负权环
Q.pop();
mark[t] = false;
for(int i=1 ; i<=N ; ++i){
if(dis[i] > dis[t]+mapp[t][i]){
dis[i] = dis[t] + mapp[t][i];
if(!mark[i]){
Q.push(i);
mark[i] = true;
}
}
}
}
if(dis[N] == INF)return -2;//返回负二代表不连通
else return dis[N];
}
inline void init(){
memset(mapp,INF,sizeof mapp);
}