80分求助大佬!
查看原帖
80分求助大佬!
444420
leoduo楼主2021/10/16 19:02
#include <bits/stdc++.h>
using namespace std;
#define MaxV 0x3f3f3f3f
struct Node{
	int begin;
	int end;
}edge[3001];
int n,m,s1,s2,t1,t2,number_1,number_2;
int head[3001];
int dist[3001],father[3001];
bool vis[3001];
bool cmp(Node x,Node y){
	if(x.begin==y.begin){
		return x.end<y.end;
	}
	return x.begin<y.begin;
}
void djs(){
	for(int i=1;i<=n;i++){
		int MinV=MaxV;
		int used;
		for(int j=1;j<=n;j++){
			if(!vis[j]&&MinV>dist[j]){
				MinV=dist[j];
				used=j; 
			}
		}
		vis[used]=1;
		for(int i=head[used];i<=m &&edge[i].begin==used;i++){
			if(dist[edge[i].end]>dist[used]+1){
				dist[edge[i].end]=dist[used]+1;
				father[edge[i].end]=used;
			}
		}
	}
}
void travel(int x){
	while(x!=1){
		number_1++;
		vis[x]=1;
		x=father[x];
	} 
}
void travel_2(int x){
	while (x!=1){
		if(vis[x]){
			break;
		}
        number_2++;
		x=father[x];
	}
}

int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
	cin>>edge[i].begin>>edge[i].end;
	}
	sort(edge+1,edge+m+1,cmp);
	head[1]=1;
	for(int i=2;i<=m;i++){
		if(edge[i].begin!=edge[i-1].begin){
			head[edge[i].begin]=i;
		}
	}
	dist[1]=0;
	for(int i=2; i<=n; i++){
		dist[i]=MaxV;
	}
	djs();
	cin>>s1>>t1>>s2>>t2;
	if(dist[s1]>t1||dist[s2]>t2){
		cout<<"-1"<<endl;
		return 0;
	}
	memset(vis,0,sizeof(vis));
	travel(s1);
	travel_2(s2);
	cout<<m-number_1-number_2<<endl;
	return 0;
}
2021/10/16 19:02
加载中...