2817 Tangent的愤怒 - Wikioi
题目描述 Description
如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段。
第二段:本题改编自Usaco Training 4.4.2...
第三段:本题加大了数据强度...
第四段:本题来自CH Round #1...
第五段:快去看第六段!
Tangent来到OI村,想起Bread经常在他面前晒妹(Lemon),于是要把二人分隔两地,永世不能相见。
黑化的Tangent拥有了分裂大地的力量,他要分裂两人的家之间的一些路,使得Bread不能去找Lemon。(保证Bread家和Lemon家连通)
从Bread家到Lemon家的路现在可以看成是一个有向图,具有N个点,M条边。(点的编号为1~N,边的编号按照离Tangent的距离由近到远依次为1~M)
Tangent想要毁坏一条边的代价是Wi。
由于Tangent想要节省力量去毁坏更多和谐的事物,所以他的炸路方案必定是总代价最小、边数量最小的,而且他希望能尽快做完这件事,所以他炸的路对应编号必定是字典序最小的。
输入描述 Input Description
第一行四个正整数N,M,S0,T0,分别表示点数,边数,Bread家的点编号,Lemon家的点编号。
接下来N行,按照边的编号依次描述每条边,每行三个正整数Si,Ti,Wi,分别表示第i条边的起点、终点和毁坏代价。
输出描述 Output Description
第一行两个正整数W和K,表示总最小代价和最小炸路数量。
接下来K行,输出最小字典序方案,每行一个正整数Number,表示第Number条边要炸毁。
样例输入 Sample Input
4 5 1 4
1 3 100
3 2 50
2 4 60
1 2 40
2 3 80
样例输出 Sample Output
60 1
3
数据范围及提示 Data Size & Hint
对于30%的数据:N\leq 10, M\leq 500
对于60%的数据:N\leq 20, M\leq 1000
对于100%的数据:N\leq 50,M\leq 5000,W_{i}\leq 10^{5}
很巧妙的做法,把边权*(m+1)+1,这样最大流/(m+1)就是原来的最大流,因为+1那一部分最多加m
最大流%(m+1)就是边数,可以保证最小割又可以保证最少边数
做一遍最大流,从小到大枚举边,判断是否在最小割里,在就删除输出,再把原来的最大流减去这条边,继续做
#include<cstdio>
using namespace std; const int maxn=;
const int maxm=+; long long map[maxn][maxn],a[maxn][maxn],w[maxm];
int n,m,s,t,u[maxm],v[maxm];
long long ans; void work()
{
int i,j;
for(i=;i<=n;++i)
for(j=;j<=n;++j)
a[i][j]=map[i][j];
} long long f,aug,his[maxn];
int pre[maxn],vh[maxn],dis[maxn]; long long flow()
{
int i,j,temp,min;
bool flag=false;
f=;
aug=;
vh[]=n;
for(i=;i<=n;++i)
vh[i]=;
for(i=;i<=n;++i)
dis[i]=;
i=s;
while(dis[i]<n)
{
his[i]=aug;
flag=false;
for(j=;j<=n;++j)
if(a[i][j]>&dis[i]==dis[j]+)
{
flag=true;
if(aug>a[i][j])aug=a[i][j];
pre[j]=i;
i=j;
if(i==t)
{
f+=aug;
while(i!=s)
{
temp=pre[i];
a[temp][i]-=aug;
a[i][temp]+=aug;
i=temp;
}
aug=;
}
break;
}
if(flag)continue;
min=n-;
for(j=;j<=n;++j)
if(a[i][j]>&dis[j]<min)min=dis[j];
--vh[dis[i]];
if(vh[dis[i]]==)break;
dis[i]=min+;
++vh[dis[i]];
if(i!=s)
{
i=pre[i];
aug=his[i];
}
}
return f;
} int main()
{
int i,j;
scanf("%d%d%d%d",&n,&m,&s,&t);
for(i=;i<=m;++i)
{
scanf("%d%d%lld",&u[i],&v[i],&w[i]);
w[i]=w[i]*(m+)+;
map[u[i]][v[i]]+=w[i];
}
work();
ans=flow();
printf("%lld %lld\n",ans/(m+),ans%(m+));
for(i=;i<=m;++i)
{
work();
a[u[i]][v[i]]-=w[i];
if(flow()+w[i]==ans)
{
printf("%d\n",i);
map[u[i]][v[i]]-=w[i];
ans-=w[i];
}
}
return ;
}
2817 Tangent的愤怒 - Wikioi的更多相关文章
- Blockly编程:用Scratch制作游戏愤怒的小牛(小鸟)
愤怒的小鸟曾经很热门,网上还说他是程序员最喜欢玩的游戏.最先我是WIKIOI的评测页面看到他的,后来在2014年全国信息学奥林匹克联赛第一天第三题飞扬的小鸟也看到了它.因此,突然想做一个类似愤怒的小鸟 ...
- Scratch编程小案例:愤怒的小牛
愤怒的小鸟曾经很热门,网上还说他是程序员最喜欢玩的游戏.最先我是WIKIOI的评测页面看到他的,后来在2014年全国信息学奥林匹克联赛第一天第三题飞扬的小鸟也看到了它.因此,突然想做一个类似愤怒的小鸟 ...
- 元首的愤怒 SharePoint Apps
柏林数据中心的服务器机架已经插满.CPU 100%.电力基础设施处在崩溃的边缘,但当元首决定迁移到 Office 365 的时候,将军们却告诉他那里没有 Farm Solution,5 年多的投资将付 ...
- 【wikioi】1041 Car的旅行路线
题目链接 算法:最短路(数据弱,Floyd也能过) 惨痛的教训:此题我至少提交了20次,原因在于= =太草率和粗心了,看到那个多少组数据以为是城市的数量,导致数组开得小小的= =.(对不起,wikio ...
- 【wikioi】1040 统计单词个数
题目链接 算法:划分型DP PS:被卡过3天.日期:2013-10-10 ~ 2013-10-12 18:52:48 这题是我提交了13次AC= =汗= = 题目描述: 给出一个长度不超过200的由小 ...
- [wikioi 1418]铃仙•优昙华院稻叶(东方幻想乡系列模拟赛)(树上递推)
题目:http://www.wikioi.com/problem/1418/ 分析: 一看就肯定是树上的递推 设f[i][j][k]表示第i秒在k点(从j点走过来的)的概率 则f[i][j][k]=f ...
- [wikioi 1307][poj 2054]欧少堆(乱搞)
题目:http://www.wikioi.com/problem/1307/ 题意:给你一个树,上面有n个节点,每个节点都有一个价值p,求一个n个节点的排列顺序,是的Σi*p[i]最小(要求父节点一定 ...
- [wikioi 1519]过路费(最小生成树+树链剖分)
题目:http://www.wikioi.com/problem/1519/ 题意:给你一个连通的无向图,每条边都有权值,给你若干个询问(x,y),要输出从x到y的路径上边的最大值的最小值 分析:首先 ...
- BUAA1389愤怒的DZY(最大值最小化)
http://acm.buaa.edu.cn/problem/1389/ 愤怒的DZY[问题描述]“愤怒的小鸟”如今已经是家喻户晓的游戏了,机智的WJC最近发明了一个类似的新游戏:“愤怒的DZY”.游 ...
随机推荐
- 安装程序无法初始化。请下载Adobe Support Advisor检测该问题
adobe FLASH BUILDER 4.6在安装时出现各种各样的问题,虽然绿化版安装方便,但是平均5分钟一崩溃实在让人头大.安装时出现“安装程序无法初始化.请下载Adobe Support Adv ...
- linux c/c++ IP字符串转换成可比较大小的数字
由www.169it.com搜集整理 IP字符串转换成可比较大小的数字,具体代码如下所示: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include "stdio. ...
- C# IO操作(五)文件的递归加载
本篇是一个案例,其核心通过代码展示代码中的递归这个用法,程序的界面如下:
- python的全局变量玩法还挺特别的
global g_arr def add(): #global g_arr g_arr = [] g_arr.append(1) add() print g_arr #你将收获一个NameError错 ...
- streams 日差管理及监控
第一部分 stream环境的日常管理 1.capture进程管理 --capture进程信息 SET LINESIZE 200 COLUMN CAPTURE_NAME HEADING 'Capture ...
- Windows7下安装搭建redis教程和配置详解
作者:Sungeek 出处:http://www.cnblogs.com/Sungeek/ 欢迎转载,也请保留这段声明.谢谢! 简介: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于 ...
- lucene4入门(1)
欢迎转载http://www.cnblogs.com/shizhongtao/p/3440325.html lucene你可以理解为一种数据库,他是全文搜索的一种引擎. 1.首先去官网download ...
- CAF(C++ actor framework)(序列化之类,无需序列化,直接传)(二)
昨天讲了Struct,还是不够满意,毕竟C++里面类用的比较多嘛,那就先上个类, 这段代码是我稍微改编了一下的结果.都是最基本的用法. #include <utility> #includ ...
- ZigBee 入网详解
本文将根据Sniffer来详细解释ZigBee终端设备入网的整个流程,原创博文. 当协调器建立好网络后,终端设备执行zb_startrequest函数,准备入网时,他们两者之间详细的流程如下.
- GDB 进行调试 使用心得
GDB 进行调试 使用心得 转 1: 对于在应用程序中加入参数进行调试的方法: 直接用 gdb app -p1 -p2 这样进行调试是不行的. 需要像以下这样使用: #gdb app ...