51nod 80 破坏道路 思维,图论

题意:n点m条边的无向联通图.给出(s1,t1,l1),(s2,t2,l2)
1<=n<=3000. n-1<=m<=min(3000,n*(n-1)/2). 问最多删除多少条边,使得s1到t1长度不超过l1,s2到t2长度不超过l2.

边最多只有3000条.删除边最多,保留的边尽量少.
假如p1,p2为(s1,t1),(s2,t2)的路径 并且长度都符合要求.
则保留的边个数为 |p1|+|p2|-|p1∪p2|.
暴力找路径TLE....

关键:两个路径p1,p2重叠的部分也是一条路径(i,j).
假如重叠部分为(i,j),(k,l).. 那么从s1,s2从j->k时走的是不相交路径,
设其长度为x,y 显然不如让s1,s2走同一条路径.这样保留的边z<x+y.

枚举重叠路径为(i,j),现在路径固定,为了保留的边最少,显然走最短路 BFS暴力预处理即可.

注意重叠路径为(i,j)时,有4种情况,(s1-i-j-t1,s2-j-i-t2)...etc.

#include <bits/stdc++.h>
using namespace std;
const int N=3e3+5,inf=1e9;
int n,m,s1,t1,s2,t2,l1,l2,d[N][N],dis[N];
bool vis[N];
vector<int> e[N];
void bfs(int s){
	memset(vis,0,sizeof(vis));
	queue<int> q;
	for(int i=1;i<=n;i++)	dis[i]=inf;
	dis[s]=0,vis[s]=true,q.push(s);
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int i=0;i<e[u].size();i++){
			int v=e[u][i];
			if(!vis[v]){
				vis[v]=true;
				dis[v]=dis[u]+1;
				q.push(v);
			}
		}	
	}
	for(int i=1;i<=n;i++)	d[s][i]=d[i][s]=dis[i];
}
bool check(int a,int b,int c,int D){
	int d1=d[s1][a]+d[a][b]+d[b][t1];
	int d2=d[s2][c]+d[c][D]+d[D][t2];
	return d1<=l1&&d2<=l2;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		e[u].push_back(v);
		e[v].push_back(u);
	}
	cin>>s1>>t1>>l1>>s2>>t2>>l2;
	for(int i=1;i<=n;i++)	bfs(i);
	if(d[s1][t1]>l1||d[s2][t2]>l2){
		cout<<-1<<'\n';
		return 0;
	}
	int res=d[s1][t1]+d[s2][t2];
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			if(check(i,j,i,j))	res=min(res,d[s1][i]+d[i][j]+d[j][t1]+d[s2][i]+d[j][t2]);
			if(check(i,j,j,i))	res=min(res,d[s1][i]+d[i][j]+d[j][t1]+d[s2][j]+d[i][t2]);
			if(check(j,i,i,j))	res=min(res,d[s1][j]+d[j][i]+d[i][t1]+d[s2][i]+d[j][t2]);
			if(check(j,i,j,i))	res=min(res,d[s1][j]+d[j][i]+d[i][t1]+d[s2][j]+d[i][t2]);
		}
	}
	cout<<m-res<<'\n';
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值