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]);
}
posted @ 2017-05-02 11:23  largecube233  阅读(186)  评论(0编辑  收藏  举报