警示后人!
查看原帖
警示后人!
1281623
Problem1613end楼主2024/10/5 21:17

不作死就不会死。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,m,x,y,s1,s2,t1,t2,ans=-100000000000;
ll dis1[10010],dis2[10010],dis3[10010],book[4010],cnt;
bool lj[3010][3010];
queue<ll> q,kong;
void bfs(){
	q=kong;
	dis1[1]=0;
	q.push(1);
	memset(book,0,sizeof(book));
	book[1]=1;
	while(!q.empty()){
		ll jd=q.front();
		q.pop();
		for(int j=1;j<=n;j++){
			if(book[j]==0 && lj[jd][j]){
				q.push(j);
				book[j]=1;
				dis1[j]=dis1[jd]+1;
				//cout<<j<<" "<<dis1[j]<<endl;
			}
		}
	}
	//cout<<endl;
	return;
}
void bfs2(){
	q=kong;
	dis2[s1]=0;
	q.push(s1);
	memset(book,0,sizeof(book));
	book[s1]=1;
	while(!q.empty()){
		ll jd=q.front();
		q.pop();
		for(int j=1;j<=n;j++){
			if(book[j]==0 && lj[jd][j]){
				q.push(j);
				book[j]=1;
				dis2[j]=dis2[jd]+1;
			}
		}
	}
	return;
}
void bfs3(){
	q=kong;
	dis3[s2]=0;
	q.push(s2);
	memset(book,0,sizeof(book));
	book[s2]=1;
	while(!q.empty()){
		ll jd=q.front();
		q.pop();
		for(int j=1;j<=n;j++){
			if(book[j]==0 && lj[jd][j]){
				q.push(j);
				book[j]=1;
				dis3[j]=dis3[jd]+1;
			}
		}
	}
	return;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>x>>y;
		if(lj[x][y]==0) cnt++;
		lj[x][y]=1;
		lj[y][x]=1;
	}
	for(int i=1;i<=n;i++){
		dis1[i]=100000000000;
		dis2[i]=100000000000;
		dis3[i]=100000000000;
	}
	cin>>s1>>t1>>s2>>t2;
	bfs();
	bfs2();
	bfs3();
	for(int i=1;i<=n;i++){
		//cout<<dis1[i]<<" "<<dis2[i]<<" "<<dis3[i]<<endl;
		if(dis1[i]+dis2[i]<=t1 && dis1[i]+dis3[i]<=t2){
			ans=max(ans,m-(dis1[i]+dis2[i]+dis3[i]));
		}
	}
	if(ans==-100000000000){
		cout<<-1<<endl;
	}
	else{
		cout<<ans<<endl;
	}
	return 0;
}

我判掉了重路,在代码中用 cntcnt 而非 mm 来减,满分变 2020

2024/10/5 21:17
加载中...