【USACO4-3-2】街道赛跑Street Race bfs

//居然连最bfs都不会,果然我实在是太菜了啊qwq

对于第一问我们遍历每个点,每次将这个点去掉进行bfs,如果最后到不了终点说明这个点就是不可避免的点。

如果这个点是不可避免的点,我们的bfs实际上已经构建好了第一部分,接下来只要判断在第二部分中是否存在连到第一部分的边即可。如果没有的话就是中间路口,如果有的话说明在第二天存在一条从第一部分经过的路径,不满足题目条件。

#include
#include
#include
#include
#include
#define ll long long
#define inf 0x3f3f3f3f
#define N 61
using namespace std;

queue q;
int link[N][N];//领接矩阵
int res[N],ans[N],visit[N];//res[]不可避免ans中间路口
int n;

int read()
{
    char ch=getchar();int f=1,ret=0;
    while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){ret=ret*10+ch-'0';ch=getchar();}
    return f*ret;
}

int main()
{
    int x;
    //读入
    while(1)
    {
        x=read();
        while(x!=-2&&x!=-1){link[n][x]=1;x=read();}
        if (x!=-1) n++;else break;
    }n--;
    //bfs
    for (int i=1;i

你可能感兴趣的:(usaco,bfs,基本算法-bfs)