spfa——vijos1089小胖抗日
https://vijos.org/p/1089
就是spfa啦啦啦;
在跑spfa的时候判断一下就好啦;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#define Ll long long
using namespace std;
struct cs{int nxt,to;}a[1005];
bool v[101][101][11],vi[101];
int head[101],ll;
Ll q[2000],l,r,t[101];
int n,m,k,x,y;
void init(int x,int y){
a[++ll].to=y;
a[ll].nxt=head[x];
head[x]=ll;
}
int get(int t,int x,int y){
int ans=1;
if(m==0)return 1;
while(ans<=m){
int z=(t+ans)%m;
if(z==0)z=m;
if(!v[x][y][z])return ans;
ans++;
}
return 1e8;
}
void spfa(){
for(int i=0;i<=n;i++)t[i]=1e9;
q[1]=1;t[1]=0;r=1;vi[1]=0;
while(r>l){
int x=q[++l];
vi[x]=0;
for(int k=head[x];k;k=a[k].nxt){
int y=a[k].to,z=get(t[x],x,y);
if(t[y]>z+t[x]){
t[y]=z+t[x];
if(!vi[y]){
vi[y]=1;
q[++r]=y;
}
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
init(x,y);
init(y,x);
}
for(int i=1;i<=n;i++) init(i,i);
scanf("%d",&m);
for(int i=1;i<=m;i++)
while(1){
scanf("%d%d",&x,&y);
if(x==y&&x==0)break;
v[x][y][i]=v[y][x][i]=1;
}
spfa();
if(t[n]>1e7)printf("No solution.");else printf("%lld",t[n]);
}