[JSOI2015]最小表示

题目大意:
尽可能多地去掉一个有向无环图上的边,使得图的连通性不变。

思路:
拓扑排序,然后倒序求出每个结点到出度为$0$的点的距离$d$,再倒序遍历每一个点$x$,以$d$为关键字对其出边降序排序,尝试加入每一条边,若加边之前两点已经连通,则说明这条边可以删去。可以用bitset维护图的连通性,注意原图是有向图,因此不能用并查集维护。

 1 #include<queue>
 2 #include<cstdio>
 3 #include<cctype>
 4 #include<vector>
 5 #include<bitset>
 6 #include<algorithm>
 7 #include<functional>
 8 inline int getint() {
 9     char ch;
10     while(!isdigit(ch=getchar()));
11     int x=ch^‘0‘;
12     while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^‘0‘);
13     return x;
14 }
15 const int V=30001;
16 std::vector<int> e[V];
17 inline void add_edge(const int u,const int v) {
18     e[u].push_back(v);
19 }
20 int n;
21 int in[V]={0},top[V]={0};
22 inline void Kahn() {
23     std::queue<int> q;
24     for(int i=1;i<=n;i++) {
25         if(!in[i]) q.push(i);
26     }
27     int cnt=0;
28     while(!q.empty()) {
29         int x=q.front();
30         q.pop();
31         top[x]=++cnt;
32         for(unsigned i=0;i<e[x].size();i++) {
33             int &y=e[x][i];
34             if(!--in[y]) {
35                 q.push(y);
36             }
37         }
38     }
39 }
40 struct Vertex {
41     int top,id;
42     bool operator > (const Vertex &another) const {
43         return top>another.top;
44     }
45 };
46 Vertex v[V];
47 int dis[V]={0};
48 int ans=0;
49 inline bool cmp(const int x,const int y) {
50     return dis[x]>dis[y];
51 }
52 inline void DP() {
53     for(int i=0;i<n;i++) {
54         v[i]=(Vertex){top[i+1],i+1};
55     }
56     std::sort(&v[0],&v[n],std::greater<Vertex>());
57     for(int i=0;i<n;i++) {
58         int &x=v[i].id;
59         for(unsigned j=0;j<e[x].size();j++) {
60             int &y=e[x][j];
61             dis[x]=std::max(dis[x],dis[y]+1);
62         }
63     }
64 }
65 std::bitset<V> bit[V];
66 inline void cut() {
67     for(int i=0;i<n;i++) {
68         int &x=v[i].id;
69         bit[x].set(x);
70         std::sort(e[x].begin(),e[x].end(),cmp);
71         for(unsigned j=0;j<e[x].size();j++) {
72             int &y=e[x][j];
73             if(bit[x][y]) ans++;
74             bit[x]|=bit[y];
75         }
76     }
77 }
78 int main() {
79     n=getint();
80     for(int m=getint();m;m--) {
81         int u=getint(),v=getint();
82         add_edge(u,v);
83         in[v]++;
84     }
85     Kahn();
86     DP();
87     cut();
88     printf("%d\n",ans);
89     return 0;
90 }
时间: 2024-11-07 16:37:03

[JSOI2015]最小表示的相关文章

待 题表

题表 达哥终极杂题表Bzoj2839 hdu6021 Codeforces 804DBzoj2248 hdu5575 Codeforces 786CBzoj2013 bzoj2676 Codeforces 803CBzoj2386 bzoj3782 Codeforces 813DBzoj2699 cogs1667 Codeforces 814DBzoj4798 bzoj2064 Codeforces 814EBzoj4639 bzoj3505 Codeforces 815ABzoj4417 bz

「JSOI2015」圈地

「JSOI2015」圈地 传送门 显然是最小割. 首先对于所有房子,权值 \(> 0\) 的连边 \(s \to i\) ,权值 \(< 0\) 的连边 \(i \to t\) ,然后对于所有的墙,连两条边,连接起墙两边的房子,容量就是修墙的费用,然后直接用权值和 - 最小割就是最大收益. 参考代码: #include <cstring> #include <cstdio> #define rg register #define file(x) freopen(x&qu

「JSOI2015」串分割

「JSOI2015」串分割 传送门 首先我们会有一个贪心的想法:分得越均匀越好,因为长的绝对比短的大. 那么对于最均匀的情况,也就是 \(k | n\) 的情况,我们肯定是通过枚举第一次分割的位置,然后每一段长度 \(\frac{n}{k}\) 最后取最小的. 把这个思想运用到一般情况:如果分出来两段长短不一,那么长的只会比短的那个长度多 \(1\) ,再仔细想想,所有段只会有两种不同的长度 \(\lfloor \frac{n}{k} \rfloor, \lceil \frac{n}{k} \r

京瓷成功开发全球最小贴片晶振CX1008有什么特点?

京瓷成功开发全球最小CX1008贴片晶振,已于5月开始了此款全球最小水晶振动子的样品供应.这无疑是市场上小型化产品的福音,京瓷集团在全球的事业涉及原料.零件.设备.机器,以及服务.网络等各个领域.所有的生产线都具备顺应时代变化的速度感,通过融合集团的独特技术,进一步积极创造新产品.开拓新市场.亿金电子京瓷晶振代理商接下来给大家讲讲这款全球最小贴片晶振CX1008晶振. 那么CX1008晶振这款目前全球最小尺寸水晶振荡子相较于其他贴片石英晶振具有哪些特点呢?CX1008贴片晶振在产品中使用具有哪些

第13条:使类和成员的可访问性最小化

区别设计良好的模块和设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节.设计良好的模块会隐藏所有的实现细节,把它的API于它的实现清晰地隔离开来.然后,模块之间通过它们的API进行通信,一个模块不需要知道其他模块的内部工作情况,这个概念称为信息隐藏或封装.使类和成员的可访问性最小化可以有效的解除系统中各个模块的耦合度.实现每个模块的独立开发.使得系统更加的可维护,更加的健壮.对于顶层的(非嵌套的)类和接口,只有两种可能的访问级别,包级私有的和公有的

旋转数组的最小数字

题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1.NOTE:给出的所有元素都大于0,若数组大小为0,请返回0. class Solution { public: int minNumberInRotateArray(vector<int> rotateArray) { if(rotateArray.size()==0) re

【BZOJ2039】【2009国家集训队】人员雇佣 [最小割]

人员雇佣 Time Limit: 20 Sec  Memory Limit: 259 MB[Submit][Status][Discuss] Description 作为一个富有经营头脑的富翁,小L决定从本国最优秀的经理中雇佣一些来经营自己的公司.这些经理相互之间合作有一个贡献指数,(我们用Ei,j表示i经理对j经理的了解程度),即当经理i和经理j同时被雇佣时,经理i会对经理j做出贡献,使得所赚得的利润增加Ei,j.当然,雇佣每一个经理都需要花费一定的金钱Ai,对于一些经理可能他做出的贡献不值得

hiho 第118周 网络流四&#183;最小路径覆盖

描述 国庆期间正是旅游和游玩的高峰期. 小Hi和小Ho的学习小组为了研究课题,决定趁此机会派出若干个调查团去沿途查看一下H市内各个景点的游客情况. H市一共有N个旅游景点(编号1..N),由M条单向游览路线连接.在一个景点游览完后,可以顺着游览线路前往下一个景点. 为了避免游客重复游览同一个景点,游览线路保证是没有环路的. 每一个调查团可以从任意一个景点出发,沿着计划好的游览线路依次调查,到达终点后再返回.每个景点只会有一个调查团经过,不会重复调查. 举个例子: 上图中一共派出了3个调查团: 1

BZOJ2458 [BeiJing2011]最小三角形

Description Xaviera现在遇到了一个有趣的问题. 平面上有N个点,Xaviera想找出周长最小的三角形. 由于点非常多,分布也非常乱,所以Xaviera想请你来解决这个问题. 为了减小问题的难度,这里的三角形也包括共线的三点. Input 第一行包含一个整数N表示点的个数. 接下来N行每行有两个整数,表示这个点的坐标. Output 输出只有一行,包含一个6位小数,为周长最短的三角形的周长(四舍五入). Sample Input 4 1 1 2 3 3 3 3 4 Sample