求助95分普及组题目QAQ
查看原帖
求助95分普及组题目QAQ
282080
RefreshinglyNaive楼主2020/8/11 11:59
#include <bits/stdc++.h>
#define maxn 3005
using namespace std;
int head[maxn],vis[maxn],dis[maxn],tot,n,m;
int last[maxn],way1[maxn],way2[maxn];
int cnt[maxn],ans,t1,t2;
struct Edge{
	int to,nex;
}e[maxn<<1];
struct pos{
	int x,steps;
}cur,nex;
void add(int x,int y){
	e[++tot].to=y;
	e[tot].nex=head[x];
	head[x]=tot;
}
queue<pos> que;
void bfs(){
	memset(vis,0,sizeof(vis));
	vis[1]=1; dis[1]=0;
	cur.x=1; cur.steps=0; last[1]=0;
	que.push(cur);
	while(!que.empty()){
		cur=que.front();
		que.pop();
		for(int i=head[cur.x];i;i=e[i].nex){
			int to=e[i].to;
			if(!vis[to]){
				nex.x=to; nex.steps=cur.steps+1; last[to]=cur.x;
				que.push(nex); vis[to]=1; dis[to]=nex.steps;
			}
		}
	}
}
void BFS(int start,int target,int step,int op,int S){
	memset(vis,0,sizeof(vis));
	vis[start]=1; 
	cur.x=start; cur.steps=step; 
	que.push(cur);
	while(!que.empty()){
		cur=que.front();
		que.pop();
		if(op==1)
			if(cur.steps-step+S>t1) return;
		if(op==2)
			if(cur.steps-step+S>t2) return;
		if(cur.x==target){
			ans=min(ans,cur.steps);
			return;
		}
		if(cur.steps>=ans) return;
		for(int i=head[cur.x];i;i=e[i].nex){
			int to=e[i].to;
			if(!vis[to]){
				nex.x=to; nex.steps=cur.steps+1; 
				que.push(nex); vis[to]=1; 
			}
		}
	}
}
int main(){
	ios::sync_with_stdio(false); cin.tie(0);
	int x,y,s1,s2,len,tmp;
	while(cin>>n>>m){
		for(int i=1;i<=m;i++) 
			cin>>x>>y,add(x,y),add(y,x);
		cin>>s1>>t1>>s2>>t2;
		bfs();
		if(dis[s1]>t1||dis[s2]>t2){
			cout<<"-1"<<endl;
			continue;
		}
		len=1; tmp=s1; way1[1]=s1;
		while(last[tmp]!=0){
			way1[++len]=last[tmp];
			tmp=last[tmp];
		}way1[++len]=1;
		len=1; tmp=s2; way2[1]=s2;
		while(last[tmp]!=0){
			way2[++len]=last[tmp];
			tmp=last[tmp];
		}way2[++len]=1;
		memset(cnt,0,sizeof(cnt)); tmp=0;
		for(int i=1;i<=dis[s1]+1;i++) cnt[way1[i]]=1;
		for(int i=1;i<=dis[s2]+1;i++) 
			if(cnt[way2[i]]) cnt[way2[i]]=2,tmp++;
		ans=dis[s1]+dis[s2]-tmp+1;
		for(int i=1;i<=dis[s1];i++){
			if(cnt[way1[i]]==2) continue;
			BFS(way1[i],s2,dis[s1],2,dis[s1]-i+1);
		}
		for(int i=1;i<=dis[s2];i++){
			if(cnt[way2[i]]==2) continue;
			BFS(way2[i],s1,dis[s2],1,dis[s2]-i+1);
		}
		cout<<m-ans<<endl;
	}
	return 0;
}

代码是自己瞎写的,若丑不要介意

2020/8/11 11:59
加载中...