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

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

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

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

    任何一个项目发展到一定复杂性的时候,必然会面临逻辑复用的问题.在React中实现逻辑复用通常有以下几种方式:Mixin.高阶组件(HOC).修饰器(decorator).Render Props.Ho ...

  2. 比物理线程都好用的C++20的协程,你会用吗?

    摘要:事件驱动(event driven)是一种常见的代码模型,其通常会有一个主循环(mainloop)不断的从队列中接收事件,然后分发给相应的函数/模块处理.常见使用事件驱动模型的软件包括图形用户界 ...

  3. QT发布 - 动态编译,删减以来dll

    经常看到网上有些论调说 Qt 程序无比庞大,甚至拿 .NET 程序来比,说 Qt 程序打包以后跟 .NET 安装包差不多大.由此影响了很多人对 Qt 的选择.我觉得有必要对此做一些澄清-- 显然这个说 ...

  4. 【CentOS_7】一行shell实现自动清理过期日志

    昨日web测试环境登录白屏,慌忙登上机器查看,半天没找到问题. 不知哪根筋不对,df -h 一看 , /dev/sda1 已经100%. 立马 du -sh *,发现log日志有点大. 手工清理后,业 ...

  5. Linux单用户模式(修改密码、运行级别)方法详解

    很多新手当面对"忘记 root 账户密码导致无法登陆系统"这个问题时,直接选择重新系统.其实大可不必,我只需要进入 emergency mode(单用户模式)更新 root 账户的 ...

  6. 本文介绍使用windows系统自带的远程桌面mstsc连接Centos 7.x远程桌面的基本方法。

    本文介绍使用windows系统自带的远程桌面mstsc连接Centos 7.x远程桌面的基本方法. 一.前言 我希望用windows远程访问centos图形界面.xmanager连接centos远程桌 ...

  7. 1.5 RPM红帽软件包1.6 Yum软件仓库

    1.5 RPM红帽软件包 在RPM(红帽软件包管理器)公布之前,要想在Linux系统中安装软件只能采取源码包的方式安装.早期在Linux系统中安装程序是一件非常困难.耗费耐心的事情,而且大多数的服务程 ...

  8. Elasticsearch + Logstash + Kibana +Redis +Filebeat 单机版日志收集环境搭建

    1.前置工作 1.虚拟机环境简介 Linux版本:Linux localhost.localdomain 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:2 ...

  9. 11.15 dmidecode:查询系统硬件信息

    dmidecode命令可以用来在Linux系统下获取硬件方面的信息.dmidecode遵循SMBIOS/DMI标准,其输出的信息包括BIOS.处理器.内存.缓存等. dmidecode命令的参数选项及 ...

  10. KEIL下目标程序配置生成BIN文件

    圈中地址:E:\Program Files\keil4arm\ARM\ARMCC\bin\fromelf.exe --bin -o ..\OBJBIN\LY2030.BIN ..\obj\LY2052 ...