博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu1827 强连通
阅读量:5788 次
发布时间:2019-06-18

本文共 1449 字,大约阅读时间需要 4 分钟。

题意:一个人需要联系其他所有人,已知他自己联系每个人的花费,并且他可以联系某个人再让他联系他能联系到的人,给出一系列关系表示 A 能够联系 B。问他最少需要联系多少人,花费多少钱

首先,建成一个有向图,强连通分量内的点可以相互通知,但是如果某个强连通分量入度为0,那么这个强连通分量中的点不能通过其他分量到达,因此只要通知这些入度为0的强连通分量中花费最少的一个人就行了,所以强连通时更新每个分量的最小花费值,然后建边记录入度,联系人数就是入度为0的强连通分量数,而花费就是这些分量的最小花费和。

1 #include
2 #include
3 #include
4 #include
5 using namespace std; 6 7 const int maxn=1005; 8 const int maxm=2005; 9 10 int head[2][maxn],point[2][maxm],nxt[2][maxm],size[2];11 int n,t,scccnt;12 int stx[maxn],low[maxn],scc[maxn],num[maxn],a[maxn],id[maxn],ans1,ans2;13 stack
S;14 15 void init(){16 memset(head,-1,sizeof(head));17 size[0]=size[1]=0;18 ans1=ans2=0;19 }20 21 void add(int a,int b,int c=0){22 point[c][size[c]]=b;23 nxt[c][size[c]]=head[c][a];24 head[c][a]=size[c]++;25 if(c)id[b]++;26 }27 28 void dfs(int s){29 stx[s]=low[s]=++t;30 S.push(s);31 for(int i=head[0][s];~i;i=nxt[0][i]){32 int j=point[0][i];33 if(!stx[j]){34 dfs(j);35 low[s]=min(low[s],low[j]);36 }37 else if(!scc[j]){38 low[s]=min(low[s],stx[j]);39 }40 }41 if(low[s]==stx[s]){42 scccnt++;43 while(1){44 int u=S.top();S.pop();45 scc[u]=scccnt;46 if(a[u]
View Code

 

转载于:https://www.cnblogs.com/cenariusxz/p/4799351.html

你可能感兴趣的文章
【294天】我爱刷题系列053(2017.11.26)
查看>>
可替换元素和非可替换元素
查看>>
2016/08/25 The Secret Assumption of Agile
查看>>
(Portal 开发读书笔记)Portlet间交互-PortletSession
查看>>
搭建vsftpd服务器,使用匿名账户登入
查看>>
JAVA中循环删除list中元素的方法总结
查看>>
Java虚拟机管理的内存运行时数据区域解释
查看>>
人人都会深度学习之Tensorflow基础快速入门
查看>>
ChPlayer播放器的使用
查看>>
js 经过修改改良的全浏览器支持的软键盘,随机排列
查看>>
Mysql读写分离
查看>>
探寻Interpolator源码,自定义插值器
查看>>
一致性哈希
查看>>
Web日志安全分析工具 v2.0发布
查看>>
JS重载
查看>>
python2和python3同安装在Windows上,切换问题
查看>>
php加速工具xcache的安装与使用(基于LNMP环境)
查看>>
android超链接
查看>>
统计数据库大小
查看>>
第十六章:脚本化HTTP
查看>>