BZOJ 1612: [Usaco2008 Jan]Cow Contest奶牛的比赛【Floyd】
1612: [Usaco2008 Jan]Cow Contest奶牛的比賽
Time Limit: 5 Sec Memory Limit: 64 MB
Description
FJ的N(1 <= N <= 100)頭奶牛們最近參加了場(chǎng)程序設(shè)計(jì)競(jìng)賽:)。在賽場(chǎng)上,奶牛們按1..N依次編號(hào)。每頭奶牛的編程能力不盡相同,并且沒(méi)有哪兩頭奶牛的水平不相上下,也就是說(shuō),奶牛們的編程能力有明確的排名。 整個(gè)比賽被分成了若干輪,每一輪是兩頭指定編號(hào)的奶牛的對(duì)決。如果編號(hào)為A的奶牛的編程能力強(qiáng)于編號(hào)為B的奶牛(1 <= A <= N; 1 <= B <= N; A != B) ,那么她們的對(duì)決中,編號(hào)為A的奶牛總是能勝出。 FJ想知道奶牛們編程能力的具體排名,于是他找來(lái)了奶牛們所有 M(1 <= M <= 4,500)輪比賽的結(jié)果,希望你能根據(jù)這些信息,推斷出盡可能多的奶牛的編程能力排名。比賽結(jié)果保證不會(huì)自相矛盾。
Input
- 第1行: 2個(gè)用空格隔開(kāi)的整數(shù):N 和 M
- 第2..M+1行: 每行為2個(gè)用空格隔開(kāi)的整數(shù)A、B,描述了參加某一輪比賽的奶 牛的編號(hào),以及結(jié)果(編號(hào)為A,即為每行的第一個(gè)數(shù)的奶牛為 勝者)
Output
- 第1行: 輸出1個(gè)整數(shù),表示排名可以確定的奶牛的數(shù)目
Sample Input
5 5
4 3
4 2
3 2
1 2
2 5
Sample Output
2
輸出說(shuō)明:
編號(hào)為2的奶牛輸給了編號(hào)為1、3、4的奶牛,也就是說(shuō)她的水平比這3頭奶牛都差。而編號(hào)為5的奶牛又輸在了她的手下,也就是說(shuō),她的水平比編號(hào)為5的奶牛強(qiáng)一些。于是,編號(hào)為2的奶牛的排名必然為第4,編號(hào)為5的奶牛的水平必然最差。其他3頭奶牛的排名仍無(wú)法確定。
題解
我們要確定一個(gè)人的排名,那么就需要知道他贏誰(shuí)或輸給誰(shuí),只有全部知道是才可以確定,如果有兩個(gè)人不確輸贏定,那么就不能確定排名。
所以我們可以Floyd一下,知道i與j的輸贏關(guān)系,最后如果i能贏j,那么j一定輸給i,如果出現(xiàn)矛盾,那么就不能確定排名。
代碼如下
#include<cstdio> #include<algorithm> using namespace std; int n,m,Ans,tl=0,hd=0,f[105],dst[105][105]; int main(){#ifndef ONLINE_JUDGEfreopen("prob.in","r",stdin);freopen("prob.out","w",stdout);#endifscanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);dst[x][y]=1;}for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(i^j&&j^k&&k^i) dst[i][j]|=dst[i][k]&&dst[k][j];for(int i=1;i<=n;i++){bool t=1;for(int j=1;j<=n;j++)if(i^j&&dst[i][j]==dst[j][i]){t=0;break;}Ans+=t;}printf("%d\n",Ans);return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/XSamsara/p/9043185.html
總結(jié)
以上是生活随笔為你收集整理的BZOJ 1612: [Usaco2008 Jan]Cow Contest奶牛的比赛【Floyd】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 树状数组求逆序数
- 下一篇: CentOS7安装和配置samba