【BZOJ】1612: [Usaco2008 Jan]Cow Contest奶牛的比赛(floyd/dfs)

http://www.lydsy.com/JudgeOnline/problem.php?id=1612

赢+输==n-1 则一定确定

dfs和floyd都行(dfs我不确定,因为我没提交,权限还没开啊囧。。。可能要过两天了。。)

dfs:

#include <cstdio>

#include <cstring>

#include <cmath>

#include <string>

#include <iostream>

#include <algorithm>

using namespace std;

#define rep(i, n) for(int i=0; i<(n); ++i)

#define for1(i,a,n) for(int i=(a);i<=(n);++i)

#define for2(i,a,n) for(int i=(a);i<(n);++i)

#define for3(i,a,n) for(int i=(a);i>=(n);--i)

#define for4(i,a,n) for(int i=(a);i>(n);--i)

#define CC(i,a) memset(i,a,sizeof(i))

#define read(a) a=getint()

#define print(a) printf("%d", a)

#define dbg(x) cout << #x << " = " << x << endl

#define rdm(x) for(int i=ihead[x]; i; i=e[i].next)

#define printarr(a, n, m) rep(aaa, n) { rep(bbb, m) cout << a[aaa][bbb]; cout << endl; }

inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }

inline const int max(const int &a, const int &b) { return a>b?a:b; }

inline const int min(const int &a, const int &b) { return a<b?a:b; }



const int N=105;

int win[N], los[N], ihead[N], cnt, n, m, vis[N];

struct ED { int to, next; }e[N*N];

void add(int u, int v) {

	e[++cnt].next=ihead[u]; ihead[u]=cnt; e[cnt].to=v;

}

int dfs(int x) {

	++los[x];

	int s=0;

	vis[x]=1;

	rdm(x) if(!vis[e[i].to]) s+=dfs(e[i].to);

	return s+1;

}

int main() {

	read(n); read(m);

	int u, v;

	while(m--) {

		read(u); read(v);

		add(u, v);

	}

	int ans=0;

	for1(i, 1, n) { 

		CC(vis, 0); --los[i];

		win[i]=dfs(i)-1;

	}

	for1(i, 1, n)

		if(win[i]+los[i]==n-1) ++ans;

	print(ans);

	return 0;

}

 

 


 

 

Description

FJ的N(1 <= N <= 100)头奶牛们最近参加了场程序设计竞赛:)。在赛场上, 奶牛们按1..N依次编号。每头奶牛的编程能力不尽相同,并且没有哪两头奶牛的 水平不相上下,也就是说,奶牛们的编程能力有明确的排名。 整个比赛被分成了若干轮,每一轮是两头指定编号的奶牛的对决。如果编号 为A的奶牛的编程能力强于编号为B的奶牛(1 <= A <= N; 1 <= B <= N; A != B) ,那么她们的对决中,编号为A的奶牛总是能胜出。 FJ想知道奶牛们编程能力的具体排名,于是他找来了奶牛们所有 M(1 <= M <= 4,500)轮比赛的结果,希望你能根据这些信息,推断出尽可能多的 奶牛的编程能力排名。比赛结果保证不会自相矛盾。

Input

* 第1行: 2个用空格隔开的整数:N 和 M * 第2..M+1行: 每行为2个用空格隔开的整数A、B,描述了参加某一轮比赛的奶 牛的编号,以及结果(编号为A,即为每行的第一个数的奶牛为 胜者) * 第1行: 输出1个整数,表示排名可以确定的奶牛的数目

Output

5 5 4 3 4 2 3 2 1 2 2 5

Sample Input

2

输出说明:

编号为2的奶牛输给了编号为1、3、4的奶牛,也就是说她的水平比这3头奶
牛都差。而编号为5的奶牛又输在了她的手下,也就是说,她的水平比编号为5的
奶牛强一些。于是,编号为2的奶牛的排名必然为第4,编号为5的奶牛的水平必
然最差。其他3头奶牛的排名仍无法确定。

Sample Output

 

HINT

Source

你可能感兴趣的:(USACO)