HZOJ 通讯
B. 通讯
题目描述
“这一切都是命运石之门的选择。”
试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短 信,并由此得知了伦太郎制作出了电话微波炉(仮)。
为了掌握时间机器的技术,SERN总部必须尽快将这个消息通过地下秘密通讯 网络,传达到所有分部。
SERN共有N个部门(总部编号为0),通讯网络有M条单向通讯线路,每条线 路有一个固定的通讯花费Ci。
为了保密,消息的传递只能按照固定的方式进行:从一个已知消息的部门向 另一个与它有线路的部门传递(可能存在多条通信线路)。我们定义总费用为所 有部门传递消息的费用和。
幸运的是,如果两个部门可以直接或间接地相互传递消息(即能按照上述方 法将信息由X传递到Y,同时能由Y传递到X),我们就可以忽略它们之间的花费。
由于资金问题(预算都花在粒子对撞机上了),SERN总部的工程师希望知道, 达到目标的最小花费是多少。
输入格式
多组数据,文件以2个0结尾。
每组数据第一行,一个整数N,表示有N个包括总部的部门(从0开始编号)。 然后是一个整数M,表示有M条单向通讯线路。
接下来M行,每行三个整数,Xi,Yi,Ci,表示第i条线路从Xi连向Yi,花费为 Ci。
输出格式
每组数据一行,一个整数表示达到目标的最小花费。
样例
样例输入
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
样例输出
150
100
50
数据范围与提示
样例解释
第一组数据:总部把消息传给分部1,分部1再传给分部2.总费用:100+50=150.
第二组数据:总部把消息传给分部1,由于分部1和分部2可以互相传递消息,所以分部1可以无费用把消息传给2.总费用:100+0=100.
第三组数据:总部把消息传给分部1,最小费用为50.总费用:50.
数据范围
对于10%的数据,保证M=N-1
对于另30%的数据,N ≤ 20 ,M ≤ 20
对于100%的数据,N ≤ 50000 ,M ≤ 10^5 ,Ci ≤ 10^5 ,
数据组数 ≤ 5
数据保证一定可以将信息传递到所有部门。
考虑到题解太短所以把题面粘上了……
大水题一个(然而居然没有一眼看出……),首先tarjan缩点,对于每个scc,贪心选择入边中最优解,最后答案即为最优。
至于正确性证明:考虑到点i时,如果i入度大于1,那么贪心选最优的一条边,他不会影响其他点,其他点也并不会影响i(无论如何与i相连的点都是和0联通的)。
因为是考试代码所以比较乱……
#include<iostream>
#include<cstring>
#include<cstdio>
#include<bitset>
#include<vector>
#include<queue>
#define ma(x) memset(x,0,sizeof(x))
#define LL long long
#define MAXN 50010
using namespace std;
struct edge
{
int u,v,w,nxt;
#define u(x) ed[x].u
#define v(x) ed[x].v
#define w(x) ed[x].w
#define n(x) ed[x].nxt
#define u2(x) ed2[x].u
#define v2(x) ed2[x].v
#define w2(x) ed2[x].w
#define n2(x) ed2[x].nxt
}ed[MAXN*10],ed2[MAXN*10];
int first[MAXN],num_e;
#define f(x) first[x]
int first2[MAXN],num_e2;
#define f2(x) first2[x]
int n,m;
inline int read();
int dfn[MAXN],low[MAXN],num;
int stack[MAXN*2],top;
int belong[MAXN],tot;
bool v[MAXN];
int du[MAXN],cu[MAXN];
vector<int> scc[MAXN];
void tarjan(int x)
{
dfn[x]=low[x]=++num;
v[x]=1;stack[++top]=x;
for(int i=f(x);i;i=n(i))
if(!dfn[v(i)])tarjan(v(i)),low[x]=min(low[x],low[v(i)]);
else if(v[v(i)])low[x]=min(low[x],dfn[v(i)]);
if(low[x]==dfn[x])
{
++tot;v[x]=0;
while(stack[top]!=x)
{
v[stack[top]]=0;
belong[stack[top]]=tot;
scc[tot].push_back(stack[top--]);
}
belong[stack[top]]=tot;
scc[tot].push_back(stack[top--]);
}
}
int dis[MAXN],ans[MAXN];
void dfs(int x,int di)
{
// dis[x]=di;
for(int i=f2(x);i;i=n2(i))
dfs(v2(i),w2(i)),ans[x]+=ans[v2(i)];
ans[x]+=di;
// cout<<scc[x][0]-1<<" "<<ans[x]<<endl;
}
/*
void spfa(int x)
{
memset(dis,0x7f,sizeof(dis));
ma(v);
queue<int> q;
v[x]=1;dis[x]=0;
q.push(x);
while(!q.empty())
{
int k=q.front();q.pop();v[k]=0;
for(int i=f2(k);i;i=n2(i))
if(dis[v2(i)]>dis[k]+w2(i))
{
dis[v2(i)]=dis[k]+w2(i);
if(!v[v2(i)])
{
v[v2(i)]=1;
q.push(v2(i));
}
}
}
}*/
inline void add(int u,int v,int w);
inline void add2(int u,int v,int w);
signed main()//多测清空!!!!!
{
// freopen("in.txt","r",stdin); while(cin>>n>>m)
{
if(!n&&!m)return 0;
ma(ed);ma(ed2);ma(first);ma(first2);ma(dfn);ma(low);ma(belong);ma(v);ma(du);ma(cu);ma(scc);ma(ans);
num_e=num_e2=top=num=tot=0;
int a,b,c;
for(int i=1;i<=m;i++)
{
a=read(),b=read(),c=read();
add(a+1,b+1,c);
}
for(int i=1;i<=n;i++)
if(!dfn[i])tarjan(i);
/* for(int i=1;i<=tot;i++)
{
printf("#%d:\n",i);
for(int j=0;j<scc[i].size();j++)
cout<<scc[i][j]<<" ";
puts("");
}
*/ for(int i=1;i<=num_e;i++)
if(belong[u(i)]!=belong[v(i)])
add2(belong[u(i)],belong[v(i)],w(i)),
du[belong[v(i)]]++,cu[belong[u(i)]]++;
if(num_e2==tot-1)
{
dfs(belong[1],0);
printf("%d\n",ans[belong[1]]);
continue;
}
else
{
LL eans=0;
for(int i=1;i<=num_e2;i++)
if(du[v2(i)]==1)
{
eans+=w2(i);
du[v2(i)]=0;
// cout<<"!"<<v2(i)<<" "<<du[v2(i)]<<endl;
}
// cout<<eans<<endl;
memset(ans,0x7f,sizeof(ans));
for(int i=1;i<=num_e2;i++)
if(du[v2(i)])
{
ans[v2(i)]=min(ans[v2(i)],w2(i));
// cout<<v2(i)<<" "<<ans[v2(i)]<<endl;
}
for(int i=1;i<=tot;i++)
if(du[i])
{
eans+=ans[i];
// cout<<scc[i][0]<<endl;
}
printf("%lld\n",eans);
}
}
}
inline int read()
{
int s=0,f=1;char a=getchar();
while(a<'0'||a>'9'){if(a=='-')f=-1;a=getchar();}
while(a>='0'&&a<='9'){s=s*10+a-'0';a=getchar();}
return f*s;
}
inline void add(int u,int v,int w)
{
++num_e;
u(num_e)=u;
v(num_e)=v;
w(num_e)=w;
n(num_e)=f(u);
f(u)=num_e;
}
inline void add2(int u,int v,int w)
{
++num_e2;
u2(num_e2)=u;
v2(num_e2)=v;
w2(num_e2)=w;
n2(num_e2)=f2(u);
f2(u)=num_e2;
}
HZOJ 通讯的更多相关文章
- HTML5笔记:跨域通讯、多线程、本地存储和多图片上传技术
最近做项目在前端我使用了很多新技术,这些技术有bootstrap.angularjs,不过最让我兴奋的还是使用了HTML5的技术,今天我想总结一些HTML5的技术,好记性不如烂笔头,写写文章可以很好的 ...
- (转)利用libcurl和国内著名的两个物联网云端通讯的例程, ubuntu和openwrt下调试成功(四)
1. libcurl 的参考文档如下 CURLOPT_HEADERFUNCTION Pass a pointer to a function that matches the following pr ...
- (转)linux下和云端通讯的例程, ubuntu和openwrt下实验成功(二)
前言: 上节用纯linux的函数实现了和云端通讯, 本节开始利用传说中的神器libcurl 话说一个网络程序员对书法十分感兴趣,退休后决定在这方面有所建树. 于是花重金购买了上等的文房四宝. 一 ...
- (转)linux下和云端通讯的例程, ubuntu和openwrt实验成功(一)
一. HTTP请求的数据流总结#上传数据, yeelink的数据流如下POST /v1.0/device/4420/sensor/9089/datapoints HTTP/1.1Host: api. ...
- 用SignalR 2.0开发客服系统[系列1:实现群发通讯]
前言 交流群:195866844 先说一下我为什么会写这个博客吧,(首先说一下,我是一个小菜鸟,讲的不好请指导 - -,) 前段时间公司的项目涉及到在B/S上使用即时通讯,(其实就是做一个B/S的客 ...
- 用SignalR 2.0开发客服系统[系列3:实现点对点通讯]
前言 交流群:195866844 目录: 用SignalR 2.0开发客服系统[系列1:实现群发通讯] 用SignalR 2.0开发客服系统[系列2:实现聊天室] 真的很感谢大家的支持,今天发表系列3 ...
- 基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(二)
我们上一篇<基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(一)>主要讲解了如何搭建一个实时数据通讯服务器,客户端与服务端是如何通讯的,相信通过上一篇的讲解,再配 ...
- 基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(一)
今天没有延续上一篇讲的内容,穿插一段小插曲,WebSocket 实时数据通讯同步的问题,今天我们并不是很纯粹地讲 WebSocket 相关知识,我们通过 WebGL 3D 拓扑图来呈现一个有趣的 De ...
- 利用WCF的双工通讯实现一个简单的心跳监控系统
何为心跳监控系统? 故名思义,就是监控某个或某些个程序的运行状态,就好比医院里面的心跳监视仪一样,能够随时显示病人的心跳情况. 心跳监控的目的是什么? 与医院里面的心跳监视仪目的类似,监控程序运行状态 ...
随机推荐
- WebGis二次开发包实例
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="index.aspx.cs& ...
- 使用Jest进行单元测试
Jest是Facebook推出的一款单元测试工具. 安装 npm install --save-dev jest ts-jest @types/jest 在package.json中添加脚本: “te ...
- 计蒜客 Red Black Tree(树形DP)
You are given a rooted tree with n nodes. The nodes are numbered 1..n. The root is node 1, and m of ...
- 洛谷P1352 没有上司的舞会 [2017年5月计划 清北学堂51精英班Day3]
P1352 没有上司的舞会 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子 结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职 ...
- Ubuntu下安装Mongo方法
场景:Ubuntu14下安装mongo,建议不要使用apt-get install 的命令安装,因为版本比较老 1.deb下载地址(可以自行选择OS,版本,server或tool或shell)http ...
- WPF e.Systemkey的一个坑
当用代码去控制按键盘F10按钮的时候,切换TabControl的标签页,然后再按其余的键盘键,无法响应 原因就是这个systemkey,是因为F10为系统的按键,用e.key==key.f10是无效的 ...
- 机器学习之Adaboost算法原理
转自:http://www.cnblogs.com/pinard/p/6133937.html 在集成学习原理小结中,我们讲到了集成学习按照个体学习器之间是否存在依赖关系可以分为两类,第一个是个体学习 ...
- js关闭或者刷新页面后执行事件
onbeforeunload 使用方法 window.onbeforeunload=function(){ return ''; } 有返回值才能弹出显示,或者有需要执行的事件也行.
- replace all
OPTION COPY OUTREC FINDREP=(INOUT=(X'0E',X'400E', X'0F',X'0F40'))
- CSS浏览器兼容解决方案
1.在ie8的甑别上,如何让样式只对ie8起作用? 用ie浏览器独有的文档注释的方式.像这样: <!DOCTYPE html> <!--> <html class=&qu ...