题意:
农场主 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 }