题目描述 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的更多相关文章

  1. Blockly编程:用Scratch制作游戏愤怒的小牛(小鸟)

    愤怒的小鸟曾经很热门,网上还说他是程序员最喜欢玩的游戏.最先我是WIKIOI的评测页面看到他的,后来在2014年全国信息学奥林匹克联赛第一天第三题飞扬的小鸟也看到了它.因此,突然想做一个类似愤怒的小鸟 ...

  2. Scratch编程小案例:愤怒的小牛

    愤怒的小鸟曾经很热门,网上还说他是程序员最喜欢玩的游戏.最先我是WIKIOI的评测页面看到他的,后来在2014年全国信息学奥林匹克联赛第一天第三题飞扬的小鸟也看到了它.因此,突然想做一个类似愤怒的小鸟 ...

  3. 元首的愤怒 SharePoint Apps

    柏林数据中心的服务器机架已经插满.CPU 100%.电力基础设施处在崩溃的边缘,但当元首决定迁移到 Office 365 的时候,将军们却告诉他那里没有 Farm Solution,5 年多的投资将付 ...

  4. 【wikioi】1041 Car的旅行路线

    题目链接 算法:最短路(数据弱,Floyd也能过) 惨痛的教训:此题我至少提交了20次,原因在于= =太草率和粗心了,看到那个多少组数据以为是城市的数量,导致数组开得小小的= =.(对不起,wikio ...

  5. 【wikioi】1040 统计单词个数

    题目链接 算法:划分型DP PS:被卡过3天.日期:2013-10-10 ~ 2013-10-12 18:52:48 这题是我提交了13次AC= =汗= = 题目描述: 给出一个长度不超过200的由小 ...

  6. [wikioi 1418]铃仙•优昙华院稻叶(东方幻想乡系列模拟赛)(树上递推)

    题目:http://www.wikioi.com/problem/1418/ 分析: 一看就肯定是树上的递推 设f[i][j][k]表示第i秒在k点(从j点走过来的)的概率 则f[i][j][k]=f ...

  7. [wikioi 1307][poj 2054]欧少堆(乱搞)

    题目:http://www.wikioi.com/problem/1307/ 题意:给你一个树,上面有n个节点,每个节点都有一个价值p,求一个n个节点的排列顺序,是的Σi*p[i]最小(要求父节点一定 ...

  8. [wikioi 1519]过路费(最小生成树+树链剖分)

    题目:http://www.wikioi.com/problem/1519/ 题意:给你一个连通的无向图,每条边都有权值,给你若干个询问(x,y),要输出从x到y的路径上边的最大值的最小值 分析:首先 ...

  9. BUAA1389愤怒的DZY(最大值最小化)

    http://acm.buaa.edu.cn/problem/1389/ 愤怒的DZY[问题描述]“愤怒的小鸟”如今已经是家喻户晓的游戏了,机智的WJC最近发明了一个类似的新游戏:“愤怒的DZY”.游 ...

随机推荐

  1. CSS3 动画记

    css3 动画 在CSS3中可以通过animation创建复杂的动画序列,像transition属性一样用来控制CSS的属性实现动画效果. animation实现动画效果主要由两个部分组成. 通过类似 ...

  2. JS中的嵌套作用域

    在JS中仅仅区分全局变量和局部变量还不够,实际上,变量作用域可以有任意层级(嵌套).其他函数内部定义的函数可以调用父函数的局部变量,而内部函数里定义的函数则不仅可以调用父函数的局部变量,还可以调用祖父 ...

  3. 【MINA】缓存区ByteBuffer和IOBuffer你要了解的常用知识

    mina中IOBuffer是Nio中ByteBuffer的衍生类,主要是解决Bytebuffer的两个不足 1.没有提供足够灵活的get/putXXX方法 2.它容量固定,难以写入可变长度的数据 特点 ...

  4. C# 为网络程序添加用户代理

    如何为网络程序添加用户代理,本人推荐使用UrlMkSetSessionOption函数, 不过该函数有一个弱点不可以X64编译,X86编译软件才可以调用该函数 否则会一直返回!S_OK意义错误.第二呢 ...

  5. Java之绘制艺术图案

    前面已经介绍过绘制方法.这里不再赘述. package com.caiduping; import java.awt.Color; import java.awt.Graphics; import j ...

  6. Contoso 大学 - 8 – 实现继承

    原文 Contoso 大学 - 8 – 实现继承 By Tom Dykstra, Tom Dykstra is a Senior Programming Writer on Microsoft's W ...

  7. ios 多线程-GCD-NSOperation

    一.线程间的通讯 1.使用NSObject类的方法performSelectorInBackground:withObject:来创建一个线程. 具体的代码:隐式创建,自动启动 [Object per ...

  8. requirejs实验002. r.js合并文件. 初体验.

    requirejs的官网上有介绍如何使用r.js合并,压缩文件的.http://requirejs.org/docs/optimization.html https://github.com/jrbu ...

  9. TIMAC 学习笔记(一)

    TIMAC是TI公司推出的基于IEEE 802.15.4的通讯协议栈,编译环境为IAR,使用IAR自带的CLIB库,CLIB库提供了轻量级的C库,它不支持嵌入式C++.适用于RF4CE协议和ZigBe ...

  10. oracle的decimal和number的对比

    Oracle只是在语法上支持decimal类型,但是在底层实际上它就是number类型,支持decimal类型是为了能把数据从Oracle数据库移到其他数据库中(如DB2等). 因为decimal在O ...