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;
}
如果自己说什麽都做不到而什麽都不去做的话,那就更是什麽都做不到,什麽都不会改变,什麽都不会结束.