题解 CF1693C【Keshi in Search of AmShZ】
显然 AmShz 可以先把该封的道路都封了,再指挥 Keshi 行动。剩下的图中,
直接做也许有些困难。我们先人为添加一条性质:保证原图是有向无环图。可以发现,似乎没有什么直接的贪心做法。考虑 DP。我们设
回到原题。可能有环怎么办呢?我们可以考虑借用 Dijsktra 算法的思想。初始时,我们令
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int INF=1e9;
typedef pair<int,int> PAIR;
priority_queue<PAIR> pq;
int out[300000];vector<int> ed[300000];bool vis[300000];
int dis[300000];
int main()
{
int n=0,m=0;scanf("%d%d",&n,&m);
for(int i=1,x=0,y=0;i<=m;i++)
{
scanf("%d%d",&x,&y);out[x]++;ed[y].push_back(x);
}
for(int i=1;i<n;i++)dis[i]=INF;
pq.push(make_pair(0,n));
while(!pq.empty())
{
int u=pq.top().second;pq.pop();
if(vis[u])continue;vis[u]=1;
for(int i=0;i<ed[u].size();i++)
{
int v=ed[u][i];
out[v]--;int x=dis[u]+out[v]+1;
if(dis[v]>x){dis[v]=x;pq.push(make_pair(-dis[v],v));}
}
}
printf("%d",dis[1]);
}
后记
非常喜欢这题。也许这种改造熟知算法的题比较符合我的审美?QaQ
以及感觉这场后面几个题也都不错。虽然好像很码,呜呜呜。