HDU5934 强连通分量
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5934
- 根据距离关系建边
- 对于强连通分量来说,只需引爆话费最小的炸弹即可引爆整个强连通分量
- 将所有的强连通分量缩成点,我们就得到了一棵树,我们只需要引爆树根的炸弹即可
- 我们可以处理出每个点所属的强连通分量的拓扑序,或者说染色法,把属于同一个强连通分量的点标上同一个数字
- 处理完强连通分量后,我们不需要建树,我们可以用并查集来维护,更好的办法是统计每个点的入度,入读为0即为根节点
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxv = ;
int V;//总共点的个数
vector<int> g[maxv];
vector<int> rg[maxv];
vector<int> vs;
bool used[maxv];
int cmp[maxv];//保存拓扑序
ll cost[maxv];//每个拓扑序的话费
ll x[],y[],r[],c[];
////scc
void dfs(int v){
used[v] = true;
for(int i = ;i<g[v].size();i++)
if(!used[g[v][i]])
dfs(g[v][i]);
vs.push_back(v);
}
void rdfs(int v,int k){
used[v] = true;
cmp[v] = k;
cost[k] = min(cost[k],c[v]);//处理出每个强连通分量的最小话费
for(int i = ;i<rg[v].size();i++)
if(!used[rg[v][i]])
rdfs(rg[v][i],k);
}
int scc(){
memset(used,,sizeof(used));
vs.clear();
for(int v = ;v<=V;v++)//这里要注意,下标是从0开始还是从1开始
if(!used[v])
dfs(v);
memset(used,,sizeof(used));
int k = ;
for(int i = vs.size()-;i>=;i--)
if(!used[vs[i]])
rdfs(vs[i],k++);
return k;
}
//////
void addedge(int i,int j){
ll dis = (y[i]-y[j])*(y[i]-y[j])+(x[i]-x[j])*(x[i]-x[j]);
if(dis <= r[i]*r[i]){
g[i].push_back(j);
rg[j].push_back(i);
}
if(dis <= r[j]*r[j]){
g[j].push_back(i);
rg[i].push_back(j);
}
}
//////
int du[];
int main(){
int t;
cin >> t;
int cas = ;
while(t--){
int n;
cin >> n;
V = n;
memset(cost,0x3f3f3f3f,sizeof(cost));
for(int i = ;i<=n;i++){
g[i].clear();
rg[i].clear();
}
for(int i = ;i<=n;i++){
scanf("%I64d%I64d%I64d%I64d",&x[i],&y[i],&r[i],&c[i]);
for(int j = ;j<i;j++){
addedge(i,j);
}
}
int k = scc();
memset(du,,sizeof(du));
for(int i = ;i<=n;i++)
for(int j = ;j<g[i].size();j++)
if(cmp[i] != cmp[g[i][j]])//拓扑序不同,度数加1
du[cmp[g[i][j]]]++;
ll ans = ;
for(int i = ;i<k;i++)
if(du[i] == )
ans += cost[i] ;
printf("Case #%d: %I64d\n",cas++,ans);
}
return ;
}
HDU5934 强连通分量的更多相关文章
- 【HDU5934】Bomb——有向图强连通分量+重建图
题目大意 二维平面上有 n 个爆炸桶,i−thi-thi−th爆炸桶位置为 (xi,yi)(x_i, y_i)(xi,yi) 爆炸范围为 rir_iri ,且需要 cic_ici 的价格引爆, ...
- POJ1236Network of Schools[强连通分量|缩点]
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16571 Accepted: 65 ...
- 有向图的强连通分量的求解算法Tarjan
Tarjan算法 Tarjan算法是基于dfs算法,每一个强连通分量为搜索树中的一颗子树.搜索时,把当前搜索树中的未处理的结点加入一个栈中,回溯时可以判断栈顶到栈中的结点是不是在同一个强连通分量中.当 ...
- Tarjan算法--强连通分量
tarjan的过程就是dfs过程. 图一般能画成树,树的边有三种类型,树枝边 + 横叉边(两点没有父子关系) + 后向边(两点之间有父子关系): 可以看到只有后向边能构成环,即只有第三张图是强连通分量 ...
- 强连通分量的一二三 | | JZOJ【P1232】 | | 我也不知道我写的什么
贴题: 在幻想乡,上白泽慧音是以知识渊博闻名的老师.春雪异变导致人间之里的很多道路都被大雪堵塞,使有的学生不能顺利地到达慧音所在的村庄.因此慧音决定换一个能够聚集最多人数的村庄作为新的教学地点.人间之 ...
- 有向图强连通分量的Tarjan算法
有向图强连通分量的Tarjan算法 [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G ...
- poj2186Popular Cows(Kosaraju算法--有向图的强连通分量的分解)
/* 题目大意:有N个cows, M个关系 a->b 表示 a认为b popular:如果还有b->c, 那么就会有a->c 问最终有多少个cows被其他所有cows认为是popul ...
- Tarjan应用:求割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)【转】【修改】
一.基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成 ...
- POJ 1236 Network of Schools(强连通分量/Tarjan缩点)
传送门 Description A number of schools are connected to a computer network. Agreements have been develo ...
随机推荐
- dubbox 增加google-gprc/protobuf支持
好久没写东西了,今年实在太忙,基本都在搞业务开发,晚上来补一篇,作为今年的收官博客.google-rpc 正式发布以来,受到了不少人的关注,这么知名的rpc框架,不集成到dubbox中有点说不过去. ...
- 数组为什么可以使用linq查询
问题引出 这视乎是个完全不必要进行讨论的话题,因为linq(这里具体是linq to objects)本来就是针对集合类型的,数组类型作为集合类型的一种当然可以使用了.不过我还是想写一下,这个问题源于 ...
- 编写轻量ajax组件01-对比webform平台上的各种实现方式
前言 Asp.net WebForm 和 Asp.net MVC(简称MVC) 都是基于Asp.net的web开发框架,两者有很大的区别,其中一个就是MVC更加注重http本质,而WebForm试图屏 ...
- 使用markdown
一.在windows下使用markdown MarkdownPad:MarkdownPad is a full-featured markdown editor for windows. Awsomi ...
- ActiveMQ入门实例Demo
前面我们已经搭建和配置好了ActiveMQ,下面来看一个Demo,体验一下MQ. JMS 消息模型 JMS消息服务应用程序结构支持两种模型:点对点模型,发布者/订阅者模型. (1)点对点模型(Queu ...
- 递推 hdu 3411
http://blog.csdn.net/wust_xhj/article/details/47779539 怎么推可以看这里 f[0]=0 f[1]=1 [0,1]* | 0 q |(n-1)= ...
- iOS之UITableView组头组尾视图/标题悬停
最近笔者在公司的iOS开发中,有一个iOS开发同事跑来问了两个问题:1.给UITableView设置了组头和组尾视图,但是一直显示不出来?2.UITableView的section的header和fo ...
- OpenCV图像的全局阈值二值化函数(OTSU)
cv::threshold(GrayImg, Bw, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);//灰度图像二值化 CV_THRESH_OTSU是提取图像最 ...
- web框架django初探
Web框架介绍 一般会分为两部分:服务器程序和应用程序.服务器程序负责对socket服务器进行封装,并在请求到来时,对请求的各种数据进行整理.应用程序则负责具体的逻辑处理.为了方便应用程序的开发,就出 ...
- python 之 logging
#coding=utf-8 import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename ...