ACM学习-破坏行动-最大网络流
来源:互联网 发布:亚马逊和淘宝哪个大 编辑:程序博客网 时间:2024/04/25 15:52
// ACM学习-破坏行动-最大网络流.cpp : 定义控制台应用程序的入口点。
//
#define _CRT_SECURE_NO_WARNINGS
#include "stdafx.h"
#include<string>
#include<stdlib.h>
#include<time.h>
#include<iostream>
using namespace std;
long n, m, s, t;//记录节点数,管道数,A地和B地编号
short g[130][130] = {0}, t1[8500], p, q, queue[130], v[130], pre[130];
long min(long a,long b){
return a < b ? a : b;
}
void augment(long v){
long i = t, j = pre[t];
while (i != s){
g[i][j] += v;//增加终端指向源端的流量
g[j][i] -= v;//减少源端到终端的流量
i = j, j = pre[i];
}
}
void maxflow(){
long i, j;
while (1){
memset(pre,0xff,sizeof(pre));
for (int i = 0; i < n; i++)v[i] = 30000;
p = q = 0;//p是队头指针,q是队尾指针
queue[0] = s;//把源点加入到队列中
for (; p <= q; p++){
i = queue[p];
for (j = 0; j < n; j++)
if (g[i][j]>0 && pre[j] < 0){//i--j这条路还可以增加流量
//j点没有被访问过
pre[j] = i;
v[j] = min(v[i],g[i][j]);
queue[++q] = j;
}
if (pre[t]>0) break;//如果找到一条到达汇点的增广路退出循环
}//外for
if (pre[t] >= 0){
augment(v[t]);
}
else{
break;
}
}
}
void solve(){
long i, j, k, tot;
for ( i = 0; i < n; i++){//i为中间点
for ( j = 0; j < n;j++)
for (k = 0; k < n; k++)
{
if (g[j][i] && g[i][k])g[j][k] = 1;
}
}
tot = 0;
//统计所有流量为0的残量边总数,即为所求
for (k = 0; k < m; k++){
i = t1[k] / n;
j = t1[k] % n;
if (g[i][j] == 0 || g[j][i] == 0)
{
tot++;
printf("%d\n", k+1);
}
}
printf("%d\n",tot);
}
int _tmain(int argc, _TCHAR* argv[])
{
//freopen("destroy.in","r",stdin);
//freopen("destroy.out","w",stdout);
long i, j, k, c;
scanf_s("%d%d%d%d",&n,&m,&s,&t);
s--, t--;//节点从零开始编号
for (k = 0; k < m; k++){
scanf_s("%d%d%d",&i,&j,&c);
i--;
j--;
g[i][j] = g[j][i] = c;
t1[k] = i*n + j;
}
maxflow();
solve();
return 0;
}
//
#define _CRT_SECURE_NO_WARNINGS
#include "stdafx.h"
#include<string>
#include<stdlib.h>
#include<time.h>
#include<iostream>
using namespace std;
long n, m, s, t;//记录节点数,管道数,A地和B地编号
short g[130][130] = {0}, t1[8500], p, q, queue[130], v[130], pre[130];
long min(long a,long b){
return a < b ? a : b;
}
void augment(long v){
long i = t, j = pre[t];
while (i != s){
g[i][j] += v;//增加终端指向源端的流量
g[j][i] -= v;//减少源端到终端的流量
i = j, j = pre[i];
}
}
void maxflow(){
long i, j;
while (1){
memset(pre,0xff,sizeof(pre));
for (int i = 0; i < n; i++)v[i] = 30000;
p = q = 0;//p是队头指针,q是队尾指针
queue[0] = s;//把源点加入到队列中
for (; p <= q; p++){
i = queue[p];
for (j = 0; j < n; j++)
if (g[i][j]>0 && pre[j] < 0){//i--j这条路还可以增加流量
//j点没有被访问过
pre[j] = i;
v[j] = min(v[i],g[i][j]);
queue[++q] = j;
}
if (pre[t]>0) break;//如果找到一条到达汇点的增广路退出循环
}//外for
if (pre[t] >= 0){
augment(v[t]);
}
else{
break;
}
}
}
void solve(){
long i, j, k, tot;
for ( i = 0; i < n; i++){//i为中间点
for ( j = 0; j < n;j++)
for (k = 0; k < n; k++)
{
if (g[j][i] && g[i][k])g[j][k] = 1;
}
}
tot = 0;
//统计所有流量为0的残量边总数,即为所求
for (k = 0; k < m; k++){
i = t1[k] / n;
j = t1[k] % n;
if (g[i][j] == 0 || g[j][i] == 0)
{
tot++;
printf("%d\n", k+1);
}
}
printf("%d\n",tot);
}
int _tmain(int argc, _TCHAR* argv[])
{
//freopen("destroy.in","r",stdin);
//freopen("destroy.out","w",stdout);
long i, j, k, c;
scanf_s("%d%d%d%d",&n,&m,&s,&t);
s--, t--;//节点从零开始编号
for (k = 0; k < m; k++){
scanf_s("%d%d%d",&i,&j,&c);
i--;
j--;
g[i][j] = g[j][i] = c;
t1[k] = i*n + j;
}
maxflow();
solve();
return 0;
}
0 0
- ACM学习-破坏行动-最大网络流
- ACM学习-最大网络流
- 破坏行动问题
- 【GDOI2004】破坏行动
- ACM网络流学习
- 【GDOI2004】破坏行动 PASCAL
- ACM hdu5352 最小费用最大流 模板 网络流
- ACM网络流模板 最大流ISAP URAL1774
- poj 3436 ACM Computer Factory(网络流最大流)
- POJ 3436 ACM Computer Factory(网络最大流)
- HDU ACM 3572 Task Schedule 网络最大流->dinic算法
- 网络流学习:(最大流)POJ1149
- 网络流之最大流学习、
- 网络流之最大流学习笔记
- ACM-ICPC训练行动路线图
- ACM-ICPC训练行动路线图
- kuangbin求带飞网络流 ACM Computer Factory(最大流节点型)
- poj 3436 ACM Computer Factory 【图论-网络流-最大流-EK-输出路径】
- mysql以及oracle的递归查询
- phalapi-入门篇4(国际化高可用和自动生成文档)
- MFC Toolbar图标尺寸调整出错解决方法
- 操作系统和网络面试总结
- [解析]Objective-C 深浅拷贝
- ACM学习-破坏行动-最大网络流
- iOS软件开发 内存管理之拷贝
- C#学习之路,学习笔记 2.1 整形、浮点型和decimal型变量
- a+1与&a+1
- copy
- 洛谷2023维护序列(线段树区间乘+区间加)
- 一道Erlang测试题的多种解法
- 手势操作
- 【bzoj1857】[Scoi2010]传送带