此题的玄学做法
查看原帖
此题的玄学做法
824457
Diode123楼主2024/7/25 18:32

本来这道题是用缩点啊拓扑排序啊最短(长?)路算法啊做的,但在集训时获得一位大佬的玄学做法:

正解=DFS+排序\textcolor{green}{正解} = \textcolor{blue}{DFS} + \textcolor{red}{排序}

裸的 DFS 会 TLE\textcolor{blue}{TLE} ,但为什么将邻接表排序就 AC\textcolor{green}{AC} 了呢,明明没有改变每个点遍历边的个数啊???

Code:

#include<bits/stdc++.h>
#define maxn 200005
using namespace std;
int n,m,val[maxn],dis[maxn];
vector<pair<int,int> > edge[maxn];
void dfs(int u,int w){
	if(dis[u]>=w) return; 
	dis[u]=w;
	for(auto v:edge[u]){
		dfs(v.second,w+(val[v.second]!=val[u]));
	}
}
int main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>val[i];
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		if(val[u]>=val[v])
			edge[v].push_back(make_pair(val[u],u));
		if(val[v]>=val[u])
			edge[u].push_back(make_pair(val[v],v));
	}
	for(int i=1;i<=n;i++) //???????????????????
		sort(edge[i].begin(),edge[i].end());
	dfs(1,1);
	cout<<dis[n]<<endl;
	return 0;
}

这是AC记录 为什么?????

2024/7/25 18:32
加载中...