poj 3660 Floyd应用(确定牛的位置)
2015-07-28 22:29
267 查看
题意:N个选手,如果A比B强,B比C强,则A必比C强。告知若干个强弱关系,问有多少人的排名可以确定。
思路:如果一个点u, 有x个点能到达此点,从u点出发,能到达y个点,若x+y=N-1,则u点的排名是确定的。用floyd算出每两个点之间的距离,最后统计,若dist[a][b]无穷大且dist[b][a]无穷大, 则a和b的排名都不能确定。
思路:如果一个点u, 有x个点能到达此点,从u点出发,能到达y个点,若x+y=N-1,则u点的排名是确定的。用floyd算出每两个点之间的距离,最后统计,若dist[a][b]无穷大且dist[b][a]无穷大, 则a和b的排名都不能确定。
#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <cstdlib> using namespace std; #define INF 0x3fffffff #define N 105 int g ; int n,m; int main(){ int i,j,k,a,b,res=0; scanf("%d %d",&n,&m); for(i = 1;i<=n;i++) for(j = 1;j<=n;j++) if(i!=j) g[i][j] = INF; for(i = 1;i<=m;i++){ scanf("%d %d",&a,&b); g[a][b] = 1; } for(i = 1;i<=n;i++) for(j = 1;j<=n;j++) for(k = 1;k<=n;k++) g[j][k] = min(g[j][k],g[j][i]+g[i][k]); for(i = 1;i<=n;i++){ for(j = 1;j<=n;j++) if(j!=i && g[i][j]==INF && g[j][i]==INF) break; if(j==n+1) res++; } printf("%d\n",res); return 0; }
相关文章推荐
- Product of Array Except Self
- pandas 学习笔记
- 在windows系统下修改hosts文件,使其可以修改
- 多租户—概述
- 利用jstree插件轻松构建树应用
- AngularJS~大话开篇
- arpg网页游戏之地图(二)
- Min Stack
- [FZYZOJ 1355] 8-2 太空飞行计划问题
- 七月二十八日 Linux操作系统c语言学习笔记
- APT攻击
- Windows文件操作的API函数[转载]
- spring多数据源配置
- iOS UIImage加载图片的问题
- delphi 判断调试状态
- 控件——ImageView
- 最大子数组问题
- Java实现JsApi方式的微信支付
- window基本知识
- 前端笔试面试题