ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【yLOI2018】锦鲤抄

2019-08-30 23:00:31  阅读:225  来源: 互联网

标签:ch int yLOI2018 read 锦鲤 include ri define


题面

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

题解

为了带入氛围还把$QQ$音乐里的《锦鲤抄》点开听了听。

让我们想想删除的顺序是什么样子的:最优的顺序一定是从拓扑序最大的点倒着删,删到拓扑序最小的点。

其中有入度的强连通分量可以全都删完(最后通过“入度”退回拓扑序小的强连通分量)如果最后一个了,就必须留一个点。

贪心即可。

#include<stack>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 500500
#define M 2000500
#define mod 1000000007
#define ri register int

using namespace std;

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

stack<int> s; vector<int> to[N];
int dfn[N],low[N],a[N],bel[N],id[N];
int n,m,k,u[M],v[M],sc=0,vc=0,ins[N],siz[N];

void tarjan(int x) {
  dfn[x]=low[x]=++sc; s.push(x); ins[x]=1;
  for (ri i=0;i<to[x].size();i++) {
    int y=to[x][i];
    if (!dfn[y]) {
      tarjan(y);
      low[x]=min(low[x],low[y]);
    }
    else {
      if (ins[y]) low[x]=min(low[x],dfn[y]);
    }
  }
  if (low[x]==dfn[x]) {
    ++vc;
    while (1) {
      int t=s.top(); s.pop(); ins[t]=0;
      bel[t]=vc;
      siz[vc]++;
      if (t==x) break;
    }
  }
}

bool cmp(int x,int y) {
  return a[x]>a[y];
}

int main() {
  n=read(); m=read(); k=read();
  for (ri i=1;i<=n;i++) a[i]=read();
  for (ri i=1;i<=m;i++) {
    u[i]=read(); v[i]=read();
    to[u[i]].push_back(v[i]);
  }
  for (ri i=1;i<=n;i++) if (!dfn[i]) tarjan(i);
  for (ri i=1;i<=m;i++) {
    if (bel[u[i]]!=bel[v[i]]) siz[bel[v[i]]]++;
  }
  for (ri i=1;i<=n;i++) id[i]=i;
  sort(id+1,id+n+1,cmp);
  int ans=0,cnt=0;
  for (ri i=1;i<=n;i++) {
    int cur=id[i];
    if (siz[bel[cur]]>1) {
      siz[bel[cur]]--;
      ans+=a[cur];
      if (++cnt==k) {
        printf("%d\n",ans);
        return 0;
      }
    }
  }
  printf("%d\n",ans);
  return 0;
}

 

标签:ch,int,yLOI2018,read,锦鲤,include,ri,define
来源: https://www.cnblogs.com/shxnb666/p/11437503.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有