【JZOJ5869】绿洲

description


analysis

  • 正解spfa

  • k k 个点每个跑一次最短路,每跑完一次统计最大值


code

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include
#include
#include
#include
#define MAXN 100005
#define MAXM MAXN*2
#define fo(i,a,b) for (register int i=a;i<=b;i++)
#define fd(i,a,b) for (register int i=a;i>=b;i--)

using namespace std;

int last[MAXM],next[MAXM],tov[MAXM];
int a[MAXN],f[MAXN],ans[MAXN];
bool bz[MAXN];
int n,m,k,tot;
queue<int>que;
__attribute__((optimize("-O3")))
int read()
{
    int x=0,f=1;
    char ch=getchar();
    while (ch<'0' || '9'if (ch=='-')f=-1;
        ch=getchar();   
    }
    while ('0'<=ch && ch<='9')
    {
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*f;
}
__attribute__((optimize("-O3")))
void link(int x,int y)
{
    next[++tot]=last[x];
    last[x]=tot;
    tov[tot]=y;
}
__attribute__((optimize("-O3")))
int main()
{
    //freopen("readin.txt","r",stdin);
    freopen("oasis.in","r",stdin);
    freopen("oasis.out","w",stdout);
    n=read(),m=read(),k=read();
    fo(i,1,k)a[i]=read();
    fo(i,1,m)
    {
        int x=read(),y=read();
        link(x,y),link(y,x);
    }
    fo(j,1,k)
    {
        memset(f,60,sizeof(f));
        memset(bz,1,sizeof(bz));
        while (!que.empty())que.pop();
        que.push(a[j]),bz[a[j]]=f[a[j]]=0;
        while (!que.empty())
        {
            int now=que.front();
            que.pop();
            for (int i=last[now];i;i=next[i])
            {
                if (f[now]+11;
                    if (bz[tov[i]])
                    {
                        bz[tov[i]]=0;
                        que.push(tov[i]);
                    }
                }
            }
            bz[now]=1;
        }
        fo(i,1,n)ans[i]=max(ans[i],f[i]);
    }
    fo(i,1,n)printf("%d ",ans[i]);
    return 0;
}

你可能感兴趣的:(模拟赛,最短路,图论)