传送门

 

题意:

  农场主 FJ 有 n 头奶牛,现在给你 m 对关系(x,y)表示奶牛x的产奶速率高于奶牛y;

  FJ 想按照奶牛的产奶速率由高到低排列这些奶牛,但是这 m 对关系可能不能精确确定这 n 头奶牛的关系;

  问最少需要额外增加多少对关系使得可以确定这 n 头奶牛的顺序;

题解:

  之所以做这道题,是因为在补CF的题时用到了bitset<>;

  搜这个容器的用法是看到了一篇标题为POJ-3275:奶牛排序Ranking the Cows(Floyd、bitset)的文章;

  正好拿着道题练练bitset<>;

  但是一做,发现,这道题和省赛的L题好像啊,做法完全相同,只是在输出结果上处理了一下;

  下午在补一下如何用bitset<>做这道题,先贴上DFS暴力AC代码;

AC代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 #define mem(a,b) memset(a,b,sizeof(a))
 6 const int maxn=1e3+50;
 7 
 8 int n,m;
 9 int num;
10 int head[maxn];
11 struct Edge
12 {
13     int to;
14     int next;
15 }G[maxn*10*2];
16 void addEdge(int u,int v)
17 {
18     G[num]={v,head[u]};
19     head[u]=num++;
20 }
21 bool vis[maxn];
22 
23 int DFS(int u)
24 {
25     int ans=1;
26     vis[u]=true;
27     for(int i=head[u];~i;i=G[i].next)
28     {
29         int v=G[i].to;
30         if(vis[v] || (i&1))
31             continue;
32         ans += DFS(v);
33     }
34     return ans;
35 }
36 int RDFS(int u)
37 {
38     int ans=1;
39     vis[u]=true;
40     for(int i=head[u];~i;i=G[i].next)
41     {
42         int v=G[i].to;
43         if(vis[v] || !(i&1))
44             continue;
45         ans += RDFS(v);
46     }
47     return ans;
48 }
49 int Solve()
50 {
51     int ans=0;
52     for(int i=1;i <= n;++i)
53     {
54         mem(vis,false);
55         int t1=DFS(i);
56         mem(vis,false);
57         int t2=RDFS(i);
58         ///第i头奶牛可以确定的奶牛个数为t1+t2-1
59         ans += n-(t1+t2-1);
60     }
61     return ans>>1;
62 }
63 void Init()
64 {
65     num=0;
66     mem(head,-1);
67 }
68 int main()
69 {
70     while(~scanf("%d%d",&n,&m))
71     {
72         Init();
73         for(int i=1;i <= m;++i)
74         {
75             int u,v;
76             scanf("%d%d",&u,&v);
77             addEdge(u,v);
78             addEdge(v,u);
79         }
80         printf("%d\n",Solve());
81     }
82     return 0;
83 }
View Code

相关文章: