比赛 NOIP2025模拟赛4 评测结果 AAAAAAAAAAAAAAATTTTT
题目名称 Daily Commute 最终得分 75
用户昵称 会挽弯弓满月 运行时间 10.595 s
代码语言 C++ 内存使用 4.73 MiB
提交时间 2025-11-27 11:05:08
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10,inf=2e9;
int n,m,d;
struct edge{
	int to,nxt;
}e[N<<1];
int h[N],tot;
void add(int u,int v){
	e[++tot]={v,h[u]};
	h[u]=tot;
}
int s[N];
int dis[N];
void bfs(){
	queue<int> q;
	for(int i=1;i<n;i++) dis[i]=inf;
	q.push(n);
	int u,v;
	while(q.size()){
		u=q.front();q.pop();
		for(int i=h[u];i;i=e[i].nxt){
			v=e[i].to;
			if(dis[v]!=inf) continue;
			q.push(v);
			dis[v]=dis[u]+1;
		}
	}
}
int ans;
int main(){
	freopen("Commute.in","r",stdin);
	freopen("Commute.out","w",stdout);
	scanf("%d%d%d",&n,&m,&d);
	int u,v;
	for(int i=1;i<=m;i++){
		scanf("%d%d",&u,&v);
		add(v,u);
	}
	for(int i=1;i<=n;i++) scanf("%d",&s[i]);
	bfs();
	while(d--){
		scanf("%d%d",&u,&v);
		swap(s[u],s[v]);
		ans=inf;
		for(int i=1;i<=n;i++) ans=min(ans,i+dis[s[i]]-1);
		printf("%d\n",ans);
	}
	
	return 0;
}