Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1177 Solved: 796[][][]
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,即为每行的第一个数的奶牛为 胜者)
Output
* 第1行: 输出1个整数,表示排名可以确定的奶牛的数目
Sample Input
5 5 4 3 4 2 3 2 1 2 2 5
Sample Output
2 输出说明: 编号为2的奶牛输给了编号为1、3、4的奶牛,也就是说她的水平比这3头奶 牛都差。而编号为5的奶牛又输在了她的手下,也就是说,她的水平比编号为5的 奶牛强一些。于是,编号为2的奶牛的排名必然为第4,编号为5的奶牛的水平必 然最差。其他3头奶牛的排名仍无法确定。
HINT
Source
和洛谷2419一样的题、、这次是Top_sortAC(mmp、洛谷评测机有问题,样例明明过,就是给我WA,好在八中评测机还正常点)~~~
如果对于每个点的排名都可以确定的话,那么要是每个点并不都在同一连通块,那么一定是没有确切排名的(并查集可判断,但有点多余、)
如果在统一连通块,通过Top_sort,借助数组更新确定的排名
1 #include2 #include 3 4 using namespace std; 5 6 const int INF(0x3f3f3f3f); 7 const int N(1100); 8 int fa[N],ok[N][N],rd[N]; 9 int sumedge,head[N];10 struct Edge11 {12 int v,next;13 Edge(int v=0,int next=0):v(v),next(next){}14 }edge[4550];15 inline void ins(int u,int v)16 {17 edge[++sumedge]=Edge(v,head[u]);18 head[u]=sumedge;19 }20 21 int find(int x)22 {23 return x==fa[x]?x:fa[x]=find(fa[x]);24 }25 26 int que[4550],l,r;27 int Top_sort(int n)28 {29 int ret=0;30 for(int i=1;i<=n;i++)31 if(!rd[i]) que[++r]=i;32 for(int i,u,v;l '9'||ch<'0';) ch=getchar();59 for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';60 }61 62 int AC()63 {64 int n,m,cnt=0; read(n), read(m);65 for(int i=1;i<=n;i++) fa[i]=i;66 for(int u,v;m--;)67 {68 read(u),read(v),ins(u,v);69 fa[find(v)]=find(u); rd[v]++;70 }71 for(int i=1;i<=n;ok[i++][i]=1)72 if(fa[i]==i) cnt++;73 if(cnt>1) puts("0");74 else printf("%d\n",Top_sort(n));75 return 0;76 }77 78 int I_want_AC=AC();79 int main(){;}