95pts求调
查看原帖
95pts求调
1235109
wangyvting01楼主2024/10/19 22:43
#include<bits/stdc++.h>
using namespace std;
int n,m,i,j,u,v,next,now,cnt,s1,t1,s2,t2;
int cntt[5];
long long w;
bool visit[100001];
long long dist[100001];
int head[200005],f[100001],ans[5][100001];
long long inf=pow(2,30)-1;
struct Edge{
	int next,to;
	long long dis;
}edge[2000005];
void add(int from,int to,long long dis){
    edge[++cnt].next=head[from];
    edge[cnt].to=to;
	edge[cnt].dis=dis;
    head[from]=cnt;
}
struct node{
	int id;
	long long dis;
	bool operator <(const node &a)const{ return a.dis<dis;}
};
void Dij(int s,int g,int num){
	memset(visit,0,sizeof visit);
	priority_queue<node>q;
	q.push(node{s,0});
	for(i=1;i<=n;i++){
		dist[i]=inf;
	}
	dist[s]=0;
	while(!q.empty()){
		node a=q.top();
		q.pop();
		now=a.id;
		if(visit[now]) continue;
		visit[now]=1;
		for(i=head[now];i;i=edge[i].next){
			j=edge[i].to;
			if(dist[now]+edge[i].dis < dist[j]){
				dist[j]=dist[now]+edge[i].dis;
				f[j]=now;
				q.push(node{j,dist[j]});
			}
		}
	}
	int flag=1;
	for(i=g;i;i=f[i]){
		ans[num][++cntt[num]]=i;
		if(i==s){
			break;
		}
	}
}
int main(){
	int an=inf;
    cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>u>>v;
		add(u,v,1);
		add(v,u,1);
	}
	cin>>s1>>t1>>s2>>t2;
	for(int i=1;i<=3;i++){
		if(i==1){
			Dij(1,s1,1);
		}
		if(i==2){
			Dij(1,s2,2);
		}
		if(i==3){
			Dij(s1,s2,3);
		}
	}
	{
		int y=cntt[1]+cntt[2]-2;
		int r=0;
		for(int i=1;i<=cntt[1];i++){
			for(int j=1;j<=cntt[2];j++){
				if(ans[1][i]==ans[2][j]){
					r++;
				}
			}
		}
		y-=r-1;
		if(cntt[1]-1<=t1&&cntt[2]-1<=t2){
			an=min(an,y);
		}
	}
	{
		int y=cntt[1]+cntt[3]-2;
		int r=0;
		for(int i=1;i<=cntt[1];i++){
			for(int j=1;j<=cntt[3];j++){
				if(ans[1][i]==ans[3][j]){
					r++;
				}
			}
		}
		y-=r-1;
		if(cntt[1]-1<=t1&&y<=t2){
			an=min(an,y);
		}
	}
	{
		int y=cntt[2]+cntt[3]-2;
		int r=0;
		for(int i=1;i<=cntt[2];i++){
			for(int j=1;j<=cntt[3];j++){
				if(ans[2][i]==ans[3][j]){
					r++;
				}
			}
		}
		y-=r-1;
		if(cntt[2]-1<=t2&&y<=t1){
			an=min(an,y);
		}
	}
	if(an==inf){
		cout<<-1<<endl;
	}else{
		cout<<m-an<<endl;
	}
	return 0;
}
2024/10/19 22:43
加载中...