[2016-04-01][codeforces][659E][New Reform]

Posted 红洋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[2016-04-01][codeforces][659E][New Reform]相关的知识,希望对你有一定的参考价值。

  • 时间:2016-04-01 19:27:59 星期五

  • 题目编号:[2016-04-01][codeforces][659E][New Reform]

  • 题目大意:给定n个城市,m条路,每条路连接两个城市,每两个城市最多只有一条路连接,现在把路改成单项的,问最少会出现几个孤立的城市(没有城市到达它),

  • 分析:

    • 在一个联通分支中,如果边数为n - 1,那么这个图就是树,树上除了根节点,其他节点都可达,如果边数大于n-1,那么至少会出现一个环,只要选的点在环上,那么所有的点都可达
    • 题目不止一个联通分支,
    • 第一个方法T了,用并查集处理整个图,从每个联通分支的父节点出发,求边数,更新最终答案–>这个T了
    • 用并查集存图,扫一遍所有节点,更新所有节点的度数和到父节点上,则边数等于总度数/2,更新每个联通分支的节点数到父节点上
  1. #include <cstring>
  2. #include <cstdio>
  3. using namespace std;
  4. const int maxn = 1E5 + 10;
  5. int fa[maxn],d[maxn],cnt[maxn];
  6. inline void ini(int n){
  7. for(int i = 0; i <= n ;++i){
  8. fa[i] = i;
  9. }
  10. memset(d,0,sizeof(int) * (n + 1));
  11. memset(cnt,0,sizeof(int) * (n + 1));
  12. }
  13. int fnd(int x){
  14. return fa[x] == x ? x:fa[x] = fnd(fa[x]);
  15. }
  16. inline void uni(int x,int y){
  17. fa[fnd(x)] = fnd(y);
  18. }
  19. int main(){
  20. int n,m,a,b;
  21. scanf("%d%d",&n,&m);
  22. ini(n);
  23. for(int i = 0;i < m ; ++i){
  24. scanf("%d%d",&a,&b);
  25. ++d[a];++d[b];
  26. uni(a,b);
  27. }
  28. int f;
  29. for(int i = 1;i <= n ; ++i){
  30. f = fnd(i);
  31. ++cnt[f];
  32. if(f != i) d[f] += d[i];
  33. }
  34. int ans = 0;
  35. for(int i = 1; i <= n ; ++i){
  36. if(fa[i] == i && cnt[i] == d[i] / 2 + 1){
  37. ++ans;
  38. }
  39. }
  40. printf("%d\n",ans);
  41. return 0;
  42. }




以上是关于[2016-04-01][codeforces][659E][New Reform]的主要内容,如果未能解决你的问题,请参考以下文章

[2016-04-01][poj][2533][Longest Ordered Subsequence]

Pandas:过去 n 天的平均值

Hive:where + in 不使用分区?

机器学习精简入门教程

大话程序猿眼里的高并发

sql语句的单双引号问题