COJ 0252 HDNOIP201304阻断传染
| HDNOIP201304阻断传染 | 
| 难度级别: A; 编程语言:不限;运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B | 
| 试题描述 | 
| H国有n个城市,n个城市用n-1条双向道路相互连通构成一棵树,1号城市是首都,也是树中的根节点。H国的首都爆发了一种危害性极高的传染病。当局为了控制疫情,不让疫情扩散到边境城市(叶子节点所表示的城市),决定在一些公路上设检疫关卡,但在不同道路上设卡的代价可能不同,为了防止边境城市受传染,必需让从首都到每个边境城市的路径上都至少有一个检疫关卡,请你编程求能阻止传染的最小设卡总代价。 | 
| 输入 | 
| 第一行一个整数 n,表示城市个数。 接下来的 n-1 行,每行 3 个整数,u、v、w,每两个整数之间用一个空格隔开,表示从城市u到城市v有一条双向道路,设卡代价为w。 数据保证输入的是一棵树,且根节点编号为1。 | 
| 输出 | 
| 其中共一行,包含一个整数,表示控制疫情所需要的最少设卡总代价。 | 
| 输入示例 | 
| 9 2 1 888 1 3 88 2 4 6 5 2 8 6 3 100 3 7 10 8 3 50 7 9 1 | 
| 输出示例 | 
| 102 | 
| 其他说明 | 
| 对于 60%的数据,2<n<10,对于 80%的数据,2<n<100,对于 100%的数据,2<n<100000 | 
题解:直接写个最小割跑去吧。。。
Wa了两发是因为bfs得时候忘设vis[S]=true了。。。QAQ。。。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#define PAU putchar(' ')
#define ENT putchar('\n')
using namespace std;
const int maxn=+,maxm=+,inf=-1u>>;
int out[maxn];
struct isap{
struct ted{int x,y,w;ted*nxt,*re;}adj[maxm],*fch[maxn],*ms,*cur[maxn],*ret[maxn];
int d[maxn],gap[maxn],n,S,T;
void init(int n){this->n=n;memset(d,-,sizeof(d));ms=adj;return;}
void add(int x,int y,int w){
*ms=(ted){x,y,w,fch[x],ms+};fch[x]=ms++;
*ms=(ted){y,x,,fch[y],ms-};fch[y]=ms++;
return;
}
void bfs(){
queue<int>Q;Q.push(T);d[T]=;
while(!Q.empty()){
int u=Q.front();Q.pop();
for(ted*e=fch[u];e;e=e->nxt){
int v=e->y;if(d[v]<)d[v]=d[u]+,Q.push(v);
}
} return;
}
int mxflow(int S,int T){
this->S=S;this->T=T;bfs();ted*e;int k=S,flow=;
for(int i=;i<=n;i++)gap[d[i]]++,cur[i]=fch[i];
while(d[S]<n){
if(k==T){
int mi=inf,pos;for(int i=S;i!=T;i=cur[i]->y)if(cur[i]->w<mi)mi=cur[i]->w,pos=i;
for(int i=S;i!=T;i=cur[i]->y)cur[i]->w-=mi,cur[i]->re->w+=mi;flow+=mi;k=pos;
} for(e=cur[k];e;e=e->nxt)if(e->w&&d[k]==d[e->y]+)break;
if(e)cur[k]=e,ret[e->y]=e->re,k=e->y;
else{if(--gap[d[k]]==)break;cur[k]=fch[k];int mi=n;
for(e=fch[k];e;e=e->nxt)if(e->w&&d[e->y]<mi)mi=d[e->y];
d[k]=mi+;gap[d[k]]++;if(k!=S)k=ret[k]->y;
}
} return flow;
}
}sol;
struct ted{int x,y,w;ted*nxt;}adj[maxm],*fch[maxn],*ms=adj;
void add(int x,int y,int w){
*ms=(ted){x,y,w,fch[x]};fch[x]=ms++;
*ms=(ted){y,x,w,fch[y]};fch[y]=ms++;
return;
}
bool vis[maxn];
void bfs(int S){
queue<int>Q;Q.push(S);vis[S]=true;
while(!Q.empty()){
int u=Q.front();Q.pop();
for(ted*e=fch[u];e;e=e->nxt){
int v=e->y;if(!vis[v]){
vis[v]=true;out[u]++;sol.add(u,v,e->w);Q.push(v);//printf("add:%d->%d %d\n",u,v,e->w);system("pause");
}
}
} return;
}
int n,m;queue<int>tset;
void makeG(){
for(int i=;i<=n;i++)if(!out[i])tset.push(i);//printf("tset:");
while(!tset.empty()){
int x=tset.front();tset.pop();sol.add(x,n+,1e9);//printf("%d ",x);
} return;
}
inline int read(){
int x=,sig=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') sig=-;ch=getchar();}
while(isdigit(ch)) x=*x+ch-'',ch=getchar();
return x*=sig;
}
inline void write(int x){
if(x==){putchar('');return;}if(x<) putchar('-'),x=-x;
int len=,buf[];while(x) buf[len++]=x%,x/=;
for(int i=len-;i>=;i--) putchar(buf[i]+'');return;
}
void init(){
n=read();m=~-n;sol.init(n+);int x,y,w;
for(int i=;i<=m;i++){
x=read();y=read();w=read();add(x,y,w);
}bfs();makeG();write(sol.mxflow(,n+));
return;
}
void work(){
return;
}
void print(){
return;
}
int main(){
init();work();print();return ;
}
COJ 0252 HDNOIP201304阻断传染的更多相关文章
- [No000057]一个人默默背单词,小心被传染哦
		不日凛冬将至,全国各地,已有多名少侠因季节变化,出现了不同程度的四肢不勤.bd不分的症状.具体表现为—— 包大人在此高能预警:不想背单词,有可能你已经被传染了. 好好的,怎么突然不想背单词了 哈佛医学 ... 
- OpenJudge计算概论-流感传染【这个题用二维数组】
		/*========================================================== 流感传染 总时间限制: 1000ms 内存限制: 65536kB 描述 有一批 ... 
- POJ C程序设计进阶  编程题#6:流感传染
		编程题#6:流感传染 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 有一批 ... 
- XSS传染基础——JavaScript中的opener、iframe
		最近研究XSS,根据etherDream大神的博客 延长XSS生命周期 写了一个子页面父页面相互修改的demo. 一. 子页面.父页面相互修改——window.opener.window.open 在 ... 
- new关键字在虚方法的动态调用中的阻断作用
		关于new关键字在虚方法动态调用中的阻断作用,也有了更明确的理论基础.在子类方法中,如果标记 new 关键字,则意味着隐藏基类实现,其实就是创建了与父类同名的另一个方法,在编译中这两个方法处于动态方法 ... 
- COJ 0801 非传统题(一)
		非传统题(一) 难度级别:A: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 大家好!我是COJ第一道非传统题,是不是感觉非常的excite ... 
- POJ 2774 Long Long Message&&HDU 1403 Longest Common Substring&&COJ 1203
		后缀数组的买1送2题... HDU的那题数据实在是太水了,后来才发现在COJ和POJ上都是WA..原因在一点:在建立sa数组的时候里面的n应该是字符串长度+1....不懂可以去看罗大神的论文... 就 ... 
- PIE 阻断回溯——Cut
		PIE(Prolog Inference Engine)通常是搜索所有的解.举个例子, 当然dialog窗口中一开始调用 run. 只会显示一个解(虽然事实上会得到两个解),在前面加上 X=1,就可以 ... 
- 当relative遇上z-index,阻断事件捕获
		今天在调试前端页面的时候,发现addflowrank这个元素的click事件不能触发了.下图是它的元素结构. 用开发者工具试图定位这个元素,看看它到底怎么了.发现:无论我怎么用光标定位这个元素都定位不 ... 
随机推荐
- iOS键盘覆盖输入框的处理.doc
			在一个多项输入界面上,会有多个UITextfield类型的输入框.为了滚动方面,我们会将他们一一添加到UITableView的cell中,从而组成一个可以上下滑动的数据输入界面. 但是字符输入是通过系 ... 
- 深入理解javascript之this
			javascript中的this含义很丰富,它能够是全局对象,当前对象或者是随意对象,这都取决于函数的调用方式.函数有下面几种调用方式:作为对象方法调用.作为函数调用.作为构造函数调用.apply或c ... 
- 二分图的最大匹配-hdu-3729-I'm Telling the Truth
			题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3729 题目意思: 有n个学生,老师询问每个学生的排名,每个学生都告诉了一个排名区间,求可能的最多的学 ... 
- 初次使用cocoapods注意事项
			在仅仅用cocoapods时可能会遇到各种各样的错误和问题 这里中总结下: 1.首先使用cocoapods有非常多优点,在github上非常多优秀的开源项目都用到了它;假设你不会使用它,那么非常多优秀 ... 
- android api 中文 (73)—— AdapterView
			前言 本章内容是android.widget.AdapterView,版本为Android 2.3 r1,翻译来自"cnmahj",欢迎大家访问他的博客:http://androi ... 
- 常用git命令整理
			花了一点时间来熟悉和整理git常用命令. 推荐的git学习资料:1.搜“Git Community Book 中文版.pdf”,git社区书,内容全面且简明扼要,第一推荐2.搜“Git权威指南.pdf ... 
- Java基础知识强化81:Math类random()方法之获取任意范围的随机数案例(面试题)
			1. 需求:设计一个方法,可以实现获取任意范围内的随机数 分析:使用方法random()如下: public static double random() 注:Returns a pseudo-ran ... 
- 应用框架 ViewPager Tab Fragment SlidingMenu
			介绍 常见的应用框架 框架一:多个tab+Fragment,点击不同的tab加载不同的Fragment,不能滑动切换只能点击切换: 框架二:多个tab+ViewPager+FragmentPagerA ... 
- Oracle 11g详细安装配置教程
			最近开始学习Oracle数据库了,根据我的理解Oracle数据库是一种强大.复杂.高性能的数据库,而且价格不菲,使用都是中大型企业,土豪专用.学习一种数据库的入门工作就是先安装这种数据库,鉴于大批道友 ... 
- BestCoder Round 59 (HDOJ 5500) Reorder the Books
			Problem Description dxy has a collection of a series of books called “The Stories of SDOI”,There are ... 
