gmoj 6827. 【2020.10.25提高组模拟】图

Description

Input

Output

Solution

这道题显然最大的k是S到T的距离

然后就是染色

跑遍最短路,对于距离小于等于k的点的连边直接染色

但对于那些距离大于k的点,防止错误,直接染成1就好了

(最好不要染0,很容易错)

Code

#include <cstdio>
#include <algorithm>
#include <cstring>
#define N 4001
# define M 2000001
#define open(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
int len,n,m,s,t,i,a,b,j,ans,k,ma,go[M],to[M],last[N],f[M],g[N],bz[M],ls[4*N];
void make(int x,int y)
{
    go[++len]=y;to[len]=last[x];last[x]=len;
}
int main()
{
    open("graph");
    scanf("%d%d",&n,&m);
    len=1;
    scanf("%d%d",&s,&t);
    for (i=1;i<=m;i++)
    {
        scanf("%d%d",&a,&b);
        make(a,b);make(b,a);
    }
    f[1]=s;
    i=0;j=1;
    memset(g,127,sizeof(g));
    g[s]=0;
    while (i<j)
    {
        i++;
        for (k=last[f[i]];k;k=to[k])
        {
            if (ls[i]+1<g[go[k]])
            {
                f[++j]=go[k];
                ls[j]=g[f[i]]+1;
                g[go[k]]=ls[j];
            }
        }
    }
    f[1]=s;
    i=0;j=1;
    while (i<j)
    {
        i++;
        for (k=last[f[i]];k;k=to[k])
        {
            if (!bz[k/2])
            {
            	ma=max(g[go[k]],g[f[i]]);
                if (ma>g[t]) bz[k/2]=1;else bz[k/2]=ma;
                f[++j]=go[k];
                ans=max(ans,bz[k/2]);
            }
        }
    }
    printf("%d\n",ans);
    for (i=1;i<=m;i++)
        printf("%d\n",bz[i]);
    return 0;
}

posted @ 2020-10-27 22:25  Sport_River  阅读(93)  评论(0编辑  收藏  举报