题目传送门

有个中文版的题面...和原题稍有不同

/*
Description
“这一切都是命运石之门的选择。”
试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短信,并由此得知了伦太郎制作出了电话微波炉(仮)。
为了掌握时间机器的技术,SERN总部必须尽快将这个消息通过地下秘密通讯网络,传达到所有分部。
SERN共有N个部门(总部编号为0),通讯网络有M条单向通讯线路,每条线路有一个固定的通讯花费Ci。
为了保密,消息的传递只能按照固定的方式进行:从一个已知消息的部门向另一个与它有线路的部门传递(可能存在多条通信线路)。我们定义总费用为所有部门传递消息的费用和。
幸运的是,如果两个部门可以直接或间接地相互传递消息(即能按照上述方法将信息由X传递到Y,同时能由Y传递到X),我们就可以忽略它们之间的花费。
由于资金问题(预算都花在粒子对撞机上了),SERN总部的工程师希望知道,达到目标的最小花费是多少。 Input
多组数据,文件以2个0结尾。
每组数据第一行,一个整数N,表示有N个包括总部的部门(从0开始编号)。然后是一个整数M,表示有M条单向通讯线路。
接下来M行,每行三个整数,Xi,Yi,Ci,表示第i条线路从Xi连向Yi,花费为Ci。 Output
每组数据一行,一个整数表示达到目标的最小花费。 Sample Input
3 3
0 1 100
1 2 50
0 2 100
3 3
0 1 100
1 2 50
2 1 100
2 2
0 1 50
0 1 100
0 0 Sample Output
150
100
50
【样例解释】
第一组数据:总部把消息传给分部1,分部1再传给分部2.总费用:100+50=150.
第二组数据:总部把消息传给分部1,由于分部1和分部2可以互相传递消息,所以分部1可以无费用把消息传给2.总费用:100+0=100.
第三组数据:总部把消息传给分部1,最小费用为50.总费用:50. Data Constraint
对于10%的数据,保证M=N-1
对于另30%的数据,N ≤ 20 ,M ≤ 20
对于100%的数据,N ≤ 50000 ,M ≤ 10^5 ,Ci ≤ 10^5 ,数据组数 ≤ 5
数据保证一定可以将信息传递到所有部门。

中文题面

初看此题,大概是要在一个有向图里找到从固定点出发遍历每个节点的最小花费

emm...瞬间想到最小生成树,prim大概是有的

"如果两个部门可以直接或间接地相互传递消息,我们就可以忽略它们之间的花费。"

也就是只要有节点形成了环,那么这些节点间通信不要钱...

这不就tarjan缩点过后prim就好了吗...

code了1h,搞出来了,结果发现样例都过不了

原因是prim在有向图里没办法处理权值相同的边!(@最小树形图)

又想了想,缩点后是个DAG图,又保证起始点可以走到所有点,所以对于每一个点,不管它选哪一个入度,都不会影响连通性

那就贪心,对于除起始点的每一个点,取它入度的最小值,然后把所有点加起来就是答案了

这玩意还比prim好写很多

上代码咯

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<ctime>
#include<cstdlib>
#include<queue>
using namespace std;
const int INF=pow(,)-; struct star {//存边
int u,v,w;
};
struct Map {//图
int ptn,edn;
star edge[];//链式前向星存储
int last[],next[];
void mapinit(int pig){//初始化
ptn=pig;
edn=;
}
void addedge(int u,int v,int w) {//加边函数
edn++;
edge[edn]=(star){u,v,w};
}
void starinit() {//前向星初始化
for(int i=;i<=ptn;i++) last[i]=-;
for(int i=;i<=edn;i++){
int flag=edge[i].u;
next[i]=last[flag];
last[flag]=i;
}
}
}A,B;//A是缩点前的图,B是缩点后的图
int bel[];//A中点对应B中哪一个点
int Bn; int tim;
int dfn[],low[];
int stack[],top;
int isput[],t_vis[];
void tarjan(int node){//tarjan缩点
tim++;
dfn[node]=tim;
low[node]=tim;
isput[node]=;
t_vis[node]=;
stack[top]=node;
top++;
for(int i=A.last[node];i!=-;i=A.next[i]){
int to=A.edge[i].v;
if(isput[to]==){
low[node]=min(low[node],dfn[to]);
}else if(t_vis[to]==){
}else{
tarjan(to);
low[node]=min(low[node],low[to]);
}
}
if(dfn[node]==low[node]){
Bn++;
for(;;){
top--;
bel[stack[top]]=Bn;
isput[stack[top]]=;
if(stack[top]==node||top==) break;
}
}
}
int ans;
int mn[]; int An,Am;
int main() {
for(;;){
if(scanf("%d",&An)==EOF)break;
//input
scanf("%d",&Am);
A.mapinit(An);
for(int i=;i<=Am;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
u++;v++;
A.addedge(u,v,w);
}
A.starinit();
//tarjan
for(int i=;i<=An;i++) {dfn[i]=;low[i]=;t_vis[i]=;}
tim=;
top=;
Bn=;
tarjan();
//getB
B.mapinit(Bn);
for(int i=;i<=A.edn;i++){//用A图的强连通分量建B图
int u=bel[A.edge[i].u],v=bel[A.edge[i].v],w=A.edge[i].w;
if(u==v) continue;
B.addedge(u,v,w);
}
B.starinit();
ans=;
//getans
for(int i=;i<=B.ptn;i++) mn[i]=INF;
for(int i=;i<=B.edn;i++){//贪心
int to=B.edge[i].v;
mn[to]=min(mn[to],B.edge[i].w);
}
mn[bel[]]=;//起始点
for(int i=;i<=B.ptn;i++){
ans+=mn[i];
}
printf("%d\n",ans);
}
return ;
}

HDU3072 Intelligence System的更多相关文章

  1. hdu3072 Intelligence System (最小树形图?)

    题意:给一个有向图,问要从0号点能到达所有点所需要经过路径的最小权值和是多少,然而,若两点强联通,则这两点互相到达不需要花费.保证0号点能到达所有点 tarjan缩点以后直接取每个点入边中花费最小的即 ...

  2. [HDU3072]:Intelligence System(塔尖+贪心)

    题目传送门 题目描述 “这一切都是命运石之门的选择.”试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短 信,并由此得知了伦太郎制作出了电话微波炉(仮).为了掌握时间机器的技术,SE ...

  3. HDU 3072 Intelligence System (强连通分量)

    Intelligence System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  4. hdoj 3072 Intelligence System【求scc&&缩点】【求连通所有scc的最小花费】

    Intelligence System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  5. Intelligence System

    Intelligence System Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

  6. HDU 3072 Intelligence System(tarjan染色缩点+贪心+最小树形图)

    Intelligence System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  7. hdu 3072 Intelligence System(Tarjan 求连通块间最小值)

    Intelligence System Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) ...

  8. Intelligence System (hdu 3072 强联通缩点+贪心)

    Intelligence System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  9. HDU——3072 Intelligence System

    Intelligence System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

随机推荐

  1. python之路day06--python2/3小区别,小数据池的概念,编码的进阶str转为bytes类型,编码和解码

    python2#print() print'abc'#range() xrange()生成器#raw_input() python3# print('abc')# range()# input() = ...

  2. web.xml:<dispatcher>

    web.xml 的 <dispatcher> 是 <filter-mapping> 下的子标签,指定 Filter 对应的请求方式,其可选值如下: REQUEST 客户端在地址 ...

  3. Windows 环境下的 protoc 安装(转)

    如果是为了编译hadoop2.8.0源码,必须使用2.5.0版本的protobuf,安装方法同下 1. 下载需要的安装包:https://github.com/google/protobuf/rele ...

  4. 【SQL】INSERT INTO SELECT语句与SELECT INTO FROM语句

    INSERT INTO SELECT语句与SELECT INTO FROM语句,都是将一个结果集插入到一个表中: #INSERT INTO SELECT语句 1.语法形式: Insert into T ...

  5. javax.websocket.DeploymentException: Multiple Endpoints may not be deployed to the same path [/websocket/{sid}] : existing endpoint was class com.sanyi.qibaobusiness.framework.webSocket.WebSocketServe

    报错: javax.websocket.DeploymentException: Multiple Endpoints may not be deployed to the same path [/w ...

  6. tomcat无法正常关闭问题分析及解决

    问题描述 通常,我们都会直接使用tomcat提供的脚本执行关闭操作,如下: # sh bin/shutdown.sh Using CATALINA_BASE: /usr/local/apache-to ...

  7. [再寄小读者之数学篇](2014-06-22 函数恒为零的一个充分条件 [中国科学技术大学2011年高等数学B考研试题])

    设 $f(x)$ 在 $\bbR$ 上连续, 又 $$\bex \phi(x)=f(x)\int_0^x f(t)\rd t \eex$$ 单调递减. 证明: $f\equiv 0$. 证明: 设 $ ...

  8. [再寄小读者之数学篇](2014-06-22 求极限 [中国科学技术大学2011年高等数学B考研试题])

    设数列 $\sed{x_n}$ 满足 $0<x_1<\pi$, $x_{n+1}=\sin x_n\ (n=1,2,\cdots)$. (1) 证明 $\dps{\vlm{n}x_n}$ ...

  9. “字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛 1010 Count

    思路:矩阵快速幂.推一下初始矩阵就好了 #include<bits/stdc++.h> #define LL long long #define fi first #define se s ...

  10. 在badboy中添加检查点并且参数化

    在badboy中添加检查点(使用百度搜索来举例): 1.打开badboy,在输入框中输入www.baidu.com,单击键盘回车键或者点击输入框右边的按钮进入百度页面: 2.在百度搜索框中输入搜索字, ...