【CF思维训练】CF1693C Keshi in Search of AmShZ
Preface
非常经典的类 Dijkstra 算法,同样类型的题目还有 [AHOI2014/JSOI2014]骑士游戏,[SDOI2010]大陆争霸。
Problem
给你一张
Solution
如果你做过我说的那两道题,那么这道题在思维上应该对您来说十分简单。
具体来说,由于一个点到
发现该转移方程是正权的,同时这是一个带环图,考虑 Dijkstra trick 优化这个 dp,即每一次我们取出一个
code:
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,m,u,v,deg[N],vis[N],dis[N];
struct node{
int u,dis;
bool operator <(const node &a)const{
return dis>a.dis;
}
};
priority_queue <node> Q;
vector <int> edge[N];
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++)
cin>>u>>v,edge[v].push_back(u),deg[u]++;
fill(dis,dis+1+n,1e9);
Q.push((node){n,0});dis[n]=0;
while(!Q.empty()){
int u=Q.top().u,w=Q.top().dis;
Q.pop();if(vis[u])continue;vis[u]=1,dis[u]=w;
for(int i=0;i<edge[u].size();i++){
int v=edge[u][i];int w=deg[v]--;
if(vis[v])continue;
Q.push((node){v,dis[u]+w});
}
}cout<<dis[1];
return 0;
}