题解:P5683 [CSP-J2019 江西] 道路拆除
似乎dis本来就不用上下标吧
题意:
给定一个
如果不能,输出
样例
思考
最后剩下的边一定构成一棵树,因为所有的环显然都是可以删掉至少一条边的,让我们来思考一下这棵树是什么形状吧。
结果:最后一定是三条链
调整法证明:若存在
注意枚举
核心代码
马蜂奇特
代码将 虽然这毫无作用
void addedge()
{
int x=in(),y=in();
cnt++;
edge[cnt].to=y;
edge[cnt].nextt=head[x];
head[x]=cnt;
cnt++;
edge[cnt].to=x;
edge[cnt].nextt=head[y];
head[y]=cnt;
}
void bfs(int pos)
{
for (int i=1;i<=n;i++) vis[i]=false,f[i]=1e9;
f[pos]=0;p=1;q[p]=pos;last=1;vis[pos]=true;
while (p<=last)
{
for (int i=head[q[p]];i;i=edge[i].nextt)
{
if (!vis[edge[i].to])
{
f[edge[i].to]=f[q[p]]+1;
vis[edge[i].to]=true;
last++;
q[last]=edge[i].to;
}
}
p++;
}
}
signed main()
{
n=in();m=in();
for (int i=2;i<=n;i++) f[i]=-1;
for (int i=1;i<=m;i++) addedge();
s1=in();t1=in();s2=in();t2=in();
bfs(1);
for (int i=1;i<=n;i++) f1[i]=f[i];
if (f[s1]>t1||f[s2]>t2)
{
cout<<-1;
return 0;
}
for (int i=1;i<=n;i++)
{
bfs(i);
if (f1[i]+f[s1]<=t1&&f1[i]+f[s2]<=t2) ans=min(ans,f1[i]+f[s1]+f[s2]);
}
cout<<m-ans;
return 0;
}