hdu - 1704 Rank(简单dfs)
2015-06-01 19:54
387 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1704
遇到标记过的就dfs,把隐含的标记,最后计数需要注意。
也可以用有向图传递闭包的方法。实质是一样的。
遇到标记过的就dfs,把隐含的标记,最后计数需要注意。
#include <cstdio> #include <cstring> int n; int vis[501][501]; void dfs(int x,int y) { for(int i=1;i<=n;i++) if(vis[y][i]) { vis[x][i]=1; dfs(x,i); } } int main() { // freopen("a.txt","r",stdin); int t,m,a,b; scanf("%d",&t); while(t--) { memset(vis,0,sizeof(vis)); scanf("%d%d",&n,&m); for(int i=0;i<m;i++) { scanf("%d%d",&a,&b); vis[a][b]=1; } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(vis[i][j]) { dfs(i,j); } int ans=0; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) if(!vis[i][j]&&!vis[j][i]) ans++; printf("%d\n",ans); } return 0; }
也可以用有向图传递闭包的方法。实质是一样的。
#include <cstdio> #include <cstring> int vis[501][501]; int main() { // freopen("a.txt","r",stdin); int t,n,m,a,b; scanf("%d",&t); while(t--) { memset(vis,0,sizeof(vis)); scanf("%d%d",&n,&m); for(int i=0;i<m;i++) { scanf("%d%d",&a,&b); vis[a][b]=1; } for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) if(vis[i][k]) { for(int j=1;j<=n;j++) vis[i][j]=vis[i][j]||vis[k][j]; } int ans=0; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) if(!vis[i][j]&&!vis[j][i]) ans++; printf("%d\n",ans); } return 0; }
相关文章推荐
- android-自定义圆形图片控件
- 基于opencv实现人脸自动定位分割
- nginx教程
- 协同过滤算法参考代码
- 移动互联网产品该怎么样运营
- Android 关于inflate
- Unity3D教程宝典之Shader篇 基本知识
- 第十二周 阅读程序(1)多重继承
- 单例模式
- ICCV2013、CVPR2013、ECCV2013目标检测相关论文
- C#Graphics画图
- 广州本田整车销售管理系统技术分析(四)
- Vim 基本命令
- VirtualBox在CentOS中安装VBOXADDITIONS出现Building the OpenGL support module FAILED
- week14----6月2日
- MEF装载dll
- (转)live555学习笔记-UsageEnvironment和TaskScheduler
- 第六十天 how can I 坚持
- keras中的优化算法
- UVa 1220 Party at Hali-Bula