【POJ2014】RAJ-Rally

题面

https://www.luogu.org/problem/P3573

题解

拓扑排序神仙题。

因为是$DAG$,所以拓扑排序搞出拓扑序。

在正反两遍$dp$搞出$f[x]$和$g[x]$

再用类似扫描线的方法更新好了。

实现时传承$yyb$的题解,用了可删堆,实现方法和可删除的$AC$自动机一样,也可以用线段树(可能要在线段树上二分跑答案)

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 500500
#define ri register int
using namespace std;

int n,m,ru[N],tup[N],f[N],g[N];
vector<int> to[N],dt[N];

inline int read() {
  int ret=0,f=0; char ch=getchar();
  while (ch<'0' || ch>'9') f|=(ch=='-'),ch=getchar();
  while (ch>='0' && ch<='9') ret*=10,ret+=(ch-'0'),ch=getchar();
  return f?-ret:ret;
}

struct keshandui {
  priority_queue<int> a,b;
  void push(int x) {
    a.push(x);
  }
  void del(int x) {
    b.push(x);
  }
  int top() {
    while (!a.empty() && !b.empty() && a.top()==b.top()) a.pop(),b.pop();
    return a.top();
  }
} q;

int main(){
  n=read(); m=read();
  for (ri i=1;i<=m;i++) {
    int u=read(),v=read();
    to[u].push_back(v); dt[v].push_back(u);
    ru[v]++;
  }
  queue<int> Q;
  for (ri i=1;i<=n;i++) if (!ru[i]) Q.push(i);
  int cc=0;
  while (!Q.empty()) {
    int x=Q.front(); Q.pop();
    tup[++cc]=x;
    for (ri i=0;i<to[x].size();i++) {
      int y=to[x][i];
      ru[y]--;
      if (!ru[y]) Q.push(y);
    }
  }
  for (ri i=1;i<=n;i++) {
    int x=tup[i];
    for (ri j=0;j<to[x].size();j++) if (f[x]+1>f[to[x][j]]) f[to[x][j]]=f[x]+1;
  }
  for (ri i=n;i>=1;i--) {
    int x=tup[i];
    for (ri j=0;j<to[x].size();j++) if (g[to[x][j]]+1>g[x]) g[x]=g[to[x][j]]+1;
  }
  for (ri i=1;i<=n;i++) q.push(g[tup[i]]);
  int ans1=n+1,ans2=-1;
  for (ri i=1;i<=n;i++) {
    int x=tup[i];
    q.del(g[x]);
    for (ri j=0;j<dt[x].size();j++) q.del(f[dt[x][j]]+g[x]+1);
    if (q.top()<ans1) ans1=q.top(),ans2=x;
    q.push(f[x]);
    for (ri j=0;j<to[x].size();j++) q.push(f[x]+g[to[x][j]]+1);
  }
  printf("%d %d\n",ans2,ans1);
}

 

转载于:https://www.cnblogs.com/shxnb666/p/11298468.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值