BZOJ3355
3355: [Usaco2004 Jan]有序奶牛
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 37 Solved: 19
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
3 5
4 2
5 2
2 1
3 1
4 1
Sample Output
2 1
3 5
4 2
5 2
HINT
3在1前,4在1前可推.输出的每一行,不能被其他推出.
分析:对于一条边x->y,若去掉之后x不能到达y,那么它是必需的。我们首先需要求出拓扑序列,然后我们按照拓扑序列反向加边,这样的目的就是为了在已知顺序的情况下维护哪些边可以互相到达,然后用一个bieset去判断一下哪些边是必须的。感谢claris和付大神对我的帮助
#include "iostream"
#include "cstdio"
#include "cstring"
#include "bitset"
#include "algorithm"
using namespace std;
const int maxn=+;
const int maxm=+;
int n,m,ed,ed2;
int ind[maxn]; //入度
int adj[maxm]; //栈顶边对应的顶点
int next1[maxm]; //上一条边的编号
int tail[maxm]; //栈顶边的编号
int vis[maxn]; //存储拓扑排序序列
bitset<maxn>f[maxn];
void add(int x,int y){
ind[y]++;
adj[++ed]=y;
next1[ed]=tail[x];
tail[x]=ed;
}
int adj2[maxm];
int next2[maxm];
int tail2[maxm];
void add2(int x,int y){
adj2[++ed2]=y;
next2[ed2]=tail2[x];
tail2[x]=ed2;
}
typedef pair<int,int> P;
P p[maxm];
int main()
{
//freopen("a.txt", "r", stdin);
//freopen("b.txt", "w", stdout);
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) f[i][i]=;
ed=;
while(m--){ //数组式邻接表建图
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
} //构造拓扑排序序列
int cnt=;
for(int i=;i<=n;i++)
if(!(ind[i]))
vis[++cnt]=i; int h=;
ed2=;
while(h<=cnt){
int a;
for(int i=tail[a=vis[h++]];i;add2(adj[i],a),i=next1[i])
if(!(--ind[adj[i]]))
vis[++cnt]=adj[i];
} int ans=;
for(int i=;i<=n;i++){
int a;
for(int j=tail2[a=vis[i]];j;f[a]|=f[adj2[j]],j=next2[j])
if(!f[a][adj2[j]])
p[++ans]=P(adj2[j],a);
}
sort(p+,p++ans);
printf("%d\n",ans);
for(int i=;i<=ans;i++)
printf("%d %d\n",p[i].first,p[i].second);
return ;
}
BZOJ3355的更多相关文章
- BZOJ3355 : [Usaco2004 Jan]有序奶牛
对于一条边x->y,若去掉之后x不能到达y,那么它是必需的. 首先拓扑排序求出拓扑序,然后按照终点拓扑序为第一关键字,起点拓扑序为第二关键字从小到大加边. 对于每个点,维护一个bitset,表示 ...
随机推荐
- UOJ 41. 矩阵变换
Discription 给出一个 N 行 M 列的矩阵A, 保证满足以下性质: 1.M>N. 2.矩阵中每个数都是 [0,N] 中的自然数. 3.每行中, [1,N] 中 ...
- systemtap notes
systemtap notes -- 10 June 2014 1 Systemtap systemtap是红帽开发的一款分析工具,如果你需要使用的话,最好在redhat的系统上,在 Ubuntu上兼 ...
- 关于one-hot encoding思考
Many learning algorithms either learn a single weight per feature, or they use distances between sam ...
- HDU 2845 Beans (两次线性dp)
Beans Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- Cocos2d-x游戏《雷电大战》开源啦!要源代码要资源快快来~~
写在前面的话:这是笔者开发的第二个小游戏<雷电大战>,之前就过这个游戏和<赵云要格斗>一样,终于将会开源. 因为自己的一些个人原因. 这个游戏还没有完毕.可是很多网友都过来寻求 ...
- react 使用 moment 进行 日期格式化
在react中使用得先导入: import moment from 'moment'; 调用: npm install moment var moment = require('moment'); m ...
- unity常见问题之20题
1:天空盒有接缝怎么解决? 答:在贴图导入设置里设置Wrap Mode为"Clamp". 2: DDS格式怎么不显示? 答:Unity不支持DDS格式,Unity会将除DDS外的其 ...
- Creo二次开发--内存清理函数
我们在处理模型文件时,总会遇到内存环境的清除问题.一个干净的Creo工作环境.是保证工作能顺利完毕的保障. ProMdlEraseNotDisplayed()函数提供了清除未显示模型的功能. 当须要循 ...
- Sublime Text2-Control Package---ShinePans
1.打开sublime Text2 2.菜单条中的preference>>BrowsePackages 3.退到上一级打开Installed Packages 4.拷贝文件到此目录 (Pa ...
- WIN7不能被远程桌面问题
不知从何时起,我的机器不能被远程桌面.在其他机器远程我,最后都提示"凭据不工作",账号和密码肯定是正确的. 我是开了远程桌面的: 也许是新近开了防火墙的缘故?检查防火墙,3389是 ...