大致题意:
给出一个又n个点,m条边组成的无向图。给出两个点s,t。对于图中的每个点,去掉这个点都需要一定的花费。求至少多少花费才能使得s和t之间不连通。
大致思路:
最基础的拆点最大流,把每个点拆作两个点 i 和 i' 连接i->i'费用为去掉这个点的花费,如果原图中有一条边a->b则连接a'->b。对这个图求出最大流即可。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
const int inf=1<<30;
const int nMax=10105;
const int mMax=3000000;
class node{
public:
int c,u,v,next;
};node edge[mMax];
int ne, head[nMax];
int cur[nMax], ps[nMax], dep[nMax];
void addedge(int u, int v,int w){ ////dinic邻接表加边
// cout<<u<<" add "<<v<<" "<<w<<endl;
edge[ne].u = u;
edge[ne].v = v;
edge[ne].c = w;
edge[ne].next = head[u];
head[u] = ne ++;
edge[ne].u = v;
edge[ne].v = u;
edge[ne].c = 0;
edge[ne].next = head[v];
head[v] = ne ++;
}
int dinic(int s, int t){ // dinic
int tr, res = 0;
int i, j, k, f, r, top;
while(1){
memset(dep, -1, sizeof(dep));
for(f = dep[ps[0]=s] = 0, r = 1; f != r;)
for(i = ps[f ++], j = head[i]; j; j = edge[j].next)
if(edge[j].c && dep[k=edge[j].v] == -1){
dep[k] = dep[i] + 1;
ps[r ++] = k;
if(k == t){
f = r; break;
}
}
if(dep[t] == -1) break;
memcpy(cur, head, sizeof(cur));
i = s, top = 0;
while(1){
if(i == t){
for(tr =inf, k = 0; k < top; k ++)
if(edge[ps[k]].c < tr)
tr = edge[ps[f=k]].c;
for(k = 0; k < top; k ++){
edge[ps[k]].c -= tr;
edge[ps[k]^1].c += tr;
}
i = edge[ps[top=f]].u;
res += tr;
}
for(j = cur[i]; cur[i]; j = cur[i] =edge[cur[i]].next){
if(edge[j].c && dep[i]+1 == dep[edge[j].v]) break;
}
if(cur[i]){
ps[top ++] = cur[i];
i = edge[cur[i]].v;
}
else{
if(top == 0) break;
dep[i] = -1;
i = edge[ps[-- top]].u;
}
}
}
return res;
}
int main()
{
int i,j,a,b,c,s,t,m,n;
while(scanf("%d%d%d%d",&n,&m,&s,&t)!=EOF)
{
ne=2;
memset(head,0,sizeof(head));
for(i=1;i<=n;i++)
{
scanf("%d",&a);
addedge(i,i+n,a);
}
for(i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
addedge(a+n,b,inf);
addedge(b+n,a,inf);
}
int res=dinic(s,t+n);
printf("%d\n",res);
}
return 0;
}
分享到:
相关推荐
### ACM/ICPC常用算法的代码库(吉林大学版,强烈推荐) #### 概述 这份文档提供了由吉林大学计算机科学与技术学院整理的一套针对ACM/ICPC竞赛的算法代码库。它包含了多种算法及其实现方式,适用于ACM/ICPC参赛者的...
"ACM/ICPC的教学与实践" ACM/ICPC是国际大学生程序设计竞赛的缩写,全球公认的规模最大、水平最高的国际大学生程序设计竞赛。该项竞赛旨在使大学生运用计算机来充分展示自己分析问题和解决问题的能力。ACM/ICPC被...
**ACM/ICPC大赛全称是ACM国际大学生程序设计竞赛(International Collegiate Programming Contest),是一项享誉全球的计算机科学竞赛。自1970年创办以来,它已经成为衡量大学计算机科学教育水平的重要标志之一,...
《ACM/ICPC题集》是吉林大学计算机科学学院在2005年精心制作的一份宝贵资源,专门针对ACM(国际大学生程序设计竞赛)/ICPC(国际大学生程序设计竞赛)进行训练和学习。这个压缩包包含了一本名为“ACM.pdf”的文档,...
### ACM/ICPC竞赛训练(北京大学暑期夏令营内容一览) #### 一、概述 ACM/ICPC(国际大学生程序设计竞赛)是一项面向全球大学生的计算机编程与算法设计比赛,旨在通过解决复杂的计算问题来培养学生的创新能力和...
《ACM/ICPC竞赛训练》是北京大学暑期课程的一个重要组成部分,主要针对计算机科学领域内的算法竞赛进行深度训练。在这些课程中,"搜索"是一个核心主题,涉及到一系列的算法和策略,旨在解决复杂的问题。这里我们将...
《ACM/ICPC 文章集合》 这篇文章集合聚焦于ACM(国际大学生程序设计竞赛)和ICPC(国际大学生程序设计竞赛),这两项赛事是全球范围内最具影响力的大学生编程比赛,旨在培养和展示参赛者的算法设计、问题解决以及...
The 36th ACM/ICPC Asia Regional Shanghai Site —— Online Contest Problem Set
ACM/ICPC2009 拉丁美洲区域赛 包含输入输出数据 题目PDF文档 详细解题报告+答案代码TXT文档 有一半是水题,2、3个比较难的 大家可以拿来做做 其中的输入输出数据,可以放到那个离线OJ系统去判断你的程序对错。(离线...
ACM/ICPC中国*辽宁第二届大学生程序设计竞赛题目
《ACM/ICPC全球总决赛试题集锦》是编程竞赛领域的瑰宝,它汇集了从1992年至2008年ACM国际大学生程序设计竞赛(ACM International Collegiate Programming Contest,简称ACM/ICPC)全球总决赛的全部试题。这个珍贵的...
2010年ACM/ICPC珠海区域赛决赛题目
【ACM/ICPC 入门详解】 ACM/ICPC(国际大学生程序设计竞赛/国际编程竞赛)是一项全球性的编程比赛,旨在培养大学生的算法设计、问题解决和团队合作能力。初学者若想踏入这个领域,首先要了解基础的编程知识和如何在...
**ACM/ICPC培训讲义**是针对国际大学生程序设计竞赛(ACM/ICPC)准备的一份重要参考资料,旨在提升参赛者在算法和程序设计方面的能力。这份讲义涵盖了多个关键领域的知识,包括**搜索算法**、**计算几何**、**动态...
在ACM/ICPC竞赛中,图论问题是常见的题目来源,涉及到的问题包括最短路径、最小生成树、网络流、拓扑排序等。最大矩阵乘积问题虽然表面上可能不直接涉及图,但在优化策略中,可以借助图论的思想,如贪心选择和动态...
【ACM/ICPC微型Judge系统详解】 在编程竞赛领域,特别是ACM(国际大学生程序设计竞赛)/ICPC(国际大学生程序设计竞赛)中,Judge系统扮演着至关重要的角色。它负责评判参赛团队提交的代码是否能正确解决特定问题。...
【摘要】中提到的“融入ACM/ICPC竞赛的程序设计类课程教学改革与探讨”主要关注如何改进计算机科学与技术、软件工程等专业的程序设计教育,以应对学生逻辑思维能力相对较弱的问题。ACM/ICPC(国际大学生程序设计竞赛...
### ACM/ICPC世界总决赛1990任务解析:罕见排序与方格游戏 #### 知识点一:罕见排序(Rare Order) 在1990年的ACM国际大学生程序设计竞赛(ACM International Collegiate Programming Contest, ICPC)世界总决赛中,...
### ACM/ICPC亚洲预赛成都赛区网络赛 #### A. ASimpleProblem **知识点:** 1. **问题描述:** - 在本题中,给出了一行键盘上的数字键,用户通过两个特定的手指(一个在左,一个在右)进行输入。 - 每个手指在...