本来这道题是用缩点啊拓扑排序啊最短(长?)路算法啊做的,但在集训时获得一位大佬的玄学做法:
正解=DFS+排序
裸的 DFS 会 TLE ,但为什么将邻接表排序就 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记录
为什么?????