这题确实水,纯板子,考试意外出错,只拿了暴力分QAQ

tarjan缩点加上拓扑排序,注意这里求最短路径时不能用最小生成树

因为是单向边,不然就可能不是一个联通图了....

  1. 1 #include<iostream>
  2. 2 #include<cstdio>
  3. 3 #include<cstring>
  4. 4 #include<string>
  5. 5 #include<cmath>
  6. 6 #include<queue>
  7. 7 #include<stack>
  8. 8 #include<vector>
  9. 9 #include<algorithm>
  10. 10 #define MAXN 100001
  11. 11 #define pt printf("-----------\n");
  12. 12 #define push_back ps
  13. 13 #define ll long long
  14. 14 using namespace std;
  15. 15 int read()
  16. 16 {
  17. 17 int x=0;char c=getchar();
  18. 18 while(c<'0'||c>'9')c=getchar();
  19. 19 while(c<='9'&&c>='0'){x=x*10+c-'0';c=getchar();}
  20. 20 return x;
  21. 21 }
  22. 22 struct node{int to,n,w;}e1[MAXN],e2[MAXN];int head1[MAXN],tot1,head2[MAXN],tot2;
  23. 23 void add1(int u,int v,int w){e1[++tot1].to=v;e1[tot1].w=w;e1[tot1].n=head1[u];head1[u]=tot1;}
  24. 24 void add2(int u,int v,int w){e2[++tot2].to=v;e2[tot2].w=w;e2[tot2].n=head2[u];head2[u]=tot2;}
  25. 25 int low[MAXN],dfn[MAXN];
  26. 26 stack<int>q;
  27. 27 bool vis[MAXN];
  28. 28 int de,cnt=0;
  29. 29 int root=1;
  30. 30 int n,m;
  31. 31 int belong[MAXN];int ru[MAXN];
  32. 32 void tarjan(int x)
  33. 33 {
  34. 34 low[x]=dfn[x]=++de;
  35. 35 vis[x]=1;q.push(x);
  36. 36 int js=0;
  37. 37 for(int i=head1[x];i;i=e1[i].n)
  38. 38 {
  39. 39 int to=e1[i].to;
  40. 40 if(!dfn[to])
  41. 41 {
  42. 42 tarjan(to);
  43. 43 low[x]=min(low[x],low[to]);
  44. 44 }
  45. 45 else if(vis[to])
  46. 46 {
  47. 47 low[x]=min(low[x],low[to]);
  48. 48 }
  49. 49 }
  50. 50 if(dfn[x]==low[x])
  51. 51 {
  52. 52 cnt++;
  53. 53 int top=0;
  54. 54 do
  55. 55 {
  56. 56 top=q.top();vis[top]=0;q.pop();belong[top]=cnt;
  57. 57 // printf("top=%d cnt=%d\n",top,cnt);
  58. 58 }
  59. 59 while(top!=x);
  60. 60 }
  61. 61 }
  62. 62 void init()
  63. 63 {
  64. 64 for(int x=1;x<=n;++x)
  65. 65 {
  66. 66 for(int i=head1[x];i;i=e1[i].n)
  67. 67 {
  68. 68 int to=e1[i].to;
  69. 69 if(belong[x]==belong[to])continue;
  70. 70 add2(belong[x],belong[to],e1[i].w);
  71. 71 ru[belong[to]]++;
  72. 72 //chu[belong[x]]++;
  73. 73 // printf("belong[%d]=%d-----belong[%d]=%d\n",x,belong[x],to,belong[to]);
  74. 74 }
  75. 75 }
  76. 76 /* for(int i=1;i<=n;++i)
  77. 77 {
  78. 78
  79. 79 }*/
  80. 80 }
  81. 81 queue<int>qq;int f[MAXN];
  82. 82 int biao[MAXN];
  83. 83 int ans=0;
  84. 84 void tuopu(int top)
  85. 85 {
  86. 86 memset(f,0x3f3f3f,sizeof(f));
  87. 87 qq.push(top);
  88. 88 f[top]=0;
  89. 89 while(!qq.empty())
  90. 90 {
  91. 91 int x=qq.front();qq.pop();
  92. 92 for(int i=head2[x];i;i=e2[i].n)
  93. 93 {
  94. 94 int to=e2[i].to;
  95. 95 ru[to]--;
  96. 96 f[to]=min(f[to],e2[i].w);
  97. 97 if(ru[to]==0)
  98. 98 {
  99. 99 qq.push(to);
  100. 100 ans+=f[to];
  101. 101 }
  102. 102 }
  103. 103 }
  104. 104 }
  105. 105 void work()
  106. 106 {
  107. 107 if(m==n-1)
  108. 108 {
  109. 109 for(int i=1;i<=m;++i)
  110. 110 {
  111. 111 int x,y,w;
  112. 112 scanf("%d%d%d",&x,&y,&w);
  113. 113 ans+=w;
  114. 114 }
  115. 115 printf("%d\n",ans);
  116. 116 }
  117. 117 else
  118. 118 {
  119. 119 for(int i=1;i<=m;++i)
  120. 120 {
  121. 121 int x,y,w;
  122. 122 scanf("%d%d%d",&x,&y,&w);
  123. 123 x++;y++;
  124. 124 //printf("x=%d y=%d\n",x,y);
  125. 125 add1(x,y,w);
  126. 126 }
  127. 127 tarjan(root);
  128. 128 init();
  129. 129 tuopu(belong[root]);
  130. 130 printf("%d\n",ans);
  131. 131 }
  132. 132 }
  133. 133 int main()
  134. 134 {
  135. 135 while(cin>>n>>m)
  136. 136 {
  137. 137 if(n==0&&m==0)break;
  138. 138 memset(low,0,sizeof(low));memset(dfn,0,sizeof(dfn));
  139. 139 memset(belong,0,sizeof(belong));memset(ru,0,sizeof(ru));
  140. 140 memset(biao,0,sizeof(biao));
  141. 141 ans=0;cnt=0;de=0;tot1=0;tot2=0;memset(head1,0,sizeof(head1));memset(head2,0,sizeof(head2));
  142. 142 work();
  143. 143 }
  144. 144 }

【模拟7.16】通讯(tarjan缩点加拓扑排序)的更多相关文章

  1. 【BZOJ-1924】所驼门王的宝藏 Tarjan缩点(+拓扑排序) + 拓扑图DP

    1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 787  Solved: 318[Submit][Stat ...

  2. 【模拟8.09】轰炸行动(bomb) (tarjan缩点和拓扑排序)

    很显然的tarjan嘛......拓扑也很容易想到 我是不会说我因为懒把拓扑改成DFS结果扔了40分然后就是纯板子了 因为我们一条路径的点如果不是一个一个炸,同时炸两个,他们一定会相互到达.... 找 ...

  3. 通讯(tarjan缩点)(20190716NOIP模拟测试4)

    B. 通讯   题目类型:传统 评测方式:文本比较  内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目描述 “这一切都是命运石之门的选择.” 试图研制时间机器的机关SERN截获了 ...

  4. [JZOJ 5905] [NOIP2018模拟10.15] 黑暗之魂(darksoul) 解题报告 (拓扑排序+单调队列+无向图基环树)

    题目链接: http://172.16.0.132/senior/#main/show/5905 题目: oi_juruo热爱一款名叫黑暗之魂的游戏.在这个游戏中玩家要操纵一名有 点生命值的无火的余灰 ...

  5. BZOJ1565 [NOI2009]植物大战僵尸 【最大权闭合子图 + tarjan缩点(或拓扑)】

    题目 输入格式 输出格式 仅包含一个整数,表示可以获得的最大能源收入.注意,你也可以选择不进行任何攻击,这样能源收入为0. 输入样例 3 2 10 0 20 0 -10 0 -5 1 0 0 100 ...

  6. luogu P3387 【模板】缩点_拓扑排序

    还是很好些的. Code: #include <stack> #include <cstdio> #include <algorithm> #include < ...

  7. hdu6165(拓扑排序+tarjan缩点)

    题意:就任意两个点能否到达: 解题思路:首先将图简化,比如假设图里有一个环,那么,这环内两个点肯定是能相互到达的,那么就不用考虑这环内的点了,很简单就想到用tarjan算法将环缩成一个点,然后就是判断 ...

  8. [luogu2272 ZJOI2007] 最大半连通子图 (tarjan缩点 拓扑排序 dp)

    传送门 题目描述 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向 ...

  9. 炸弹:线段树优化建边+tarjan缩点+建反边+跑拓扑

    这道题我做了有半个月了...终于A了... 有图为证 一句话题解:二分LR线段树优化建边+tarjan缩点+建反边+跑拓扑统计答案 首先我们根据题意,判断出来要炸弹可以连着炸,就是这个炸弹能炸到的可以 ...

随机推荐

  1. Docker 部署net5程序

    1.前言 本文讲述使用docker容器部署.net5项目.实现跨平台. 部署环境:docker 容器.liunx系统.这里采用VmWare虚拟机.并采用MobaXterm工具实现终端连接linux系统 ...

  2. MongoDB评论管理

    MongoDB简介 文章评论数据分析 相较于一般数据,文章评论一般有如下特点: 数据量巨大.通常评论量要比帖子.文章大很多 写入操作频繁. 价值较低.一般来说,我们的主要目标还是在帖子(文章)本身. ...

  3. JavaI/O流汇总

    Java中常见流学习汇总 流的含义 流在Java中是指计算中流动的缓冲区. 从外部设备流向中央处理器的数据流成为"输入流",反之成为"输出流". 字符流和字节流 ...

  4. python爬虫——拉钩网python岗位信息

    之前爬取的网页都是采用"GET"方法,这次爬取"拉勾网"是采取了"POST"的方法.其中,"GET"和"POS ...

  5. 关于__new__和__call__的想法

    __new__和__call__很像,两个都是用来产生对象的 __new__用来产生的对象是'类',class 时触发(不是) __call__用来产生的对象是'对象',这种对象无法继续产生对象,但是 ...

  6. ajax 异步无刷新点改

    <button class="status" t_id="{{$v->id}}">{{$v->status}}</button&g ...

  7. JEP 尝鲜系列 3 - 使用虚线程进行同步网络 IO 的不阻塞原理

    相关 JEP: JEP 353 Reimplement the Legacy Socket API JEP 373 Reimplement the Legacy DatagramSocket API ...

  8. [刷题] 51 N-Queens

    要求 将n个皇后摆放在n*n的棋盘中,使横.竖和两个对角线方向均不会同时出现两个皇后 思路 尝试在一行中摆放,如果摆不下,回到上一行重新摆放,直到所有行都摆下 快速判断不合法情况 竖向:col[i]表 ...

  9. Python实现TCP通讯

    Environment Client:Windows Server:KaLi Linux(VM_virtul) Network:Same LAN Client #!/usr/bin/python3 # ...

  10. 如何对你的Linux系统进行基准测试: 3开源基准测试工具

    如何对你的Linux系统进行基准测试: 3开源基准测试工具   0 赞0 评论 文章标签:SYS  Source  benchmark  tool  开源  基准  系统     linux实用程序的 ...