这题告诉我们,最小割需:满流,S断不能到T端P4126,hdoj3987

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <iomanip>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#include <cassert>
#include <stack>
#include <bitset>
#define mkp make_pair
using namespace std;
const double EPS=1e-;
typedef long long lon;
const lon SZ=,SSZ=,APB=,one=;
const lon INF=0x7FFFFFFF,mod=;
int n,m,cnt,sum,head[SSZ],dep[SSZ],snum;
int S=,T=,nex[SZ],to[SZ],wt[SZ];
int vst[SSZ];
struct nd{
int x,y;
nd(int a=,int b=):x(a),y(b){}
};
nd arr[SZ]; void add(int u,int v,int w)
{
++cnt;
nex[cnt]=head[u];
head[u]=cnt;
to[cnt]=v,wt[cnt]=w;
} void init()
{
cnt=-,sum=;
memset(head,-,sizeof(head));
//cin>>n>>m>>snum;
scanf("%d%d%d",&n,&m,&snum);
for(int i=;i<=m;++i)
{
int a,b,c;
//cin>>a>>b>>c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,);
arr[i].x=a,arr[i].y=b;
}
for(int i=;i<=snum;++i)
{
int id,val;
cin>>id>>val;
add(id,T,val);
add(T,id,);
sum+=val;
}
add(S,,INF);
add(,S,);
} bool bfs()
{
memset(dep,,sizeof(dep));
dep[S]=;
queue<int> q;
q.push(S);
for(;q.size();)
{
int fr=q.front();
q.pop();
for(int i=head[fr];i!=-;i=nex[i])
{
int t=to[i],w=wt[i];
if(!dep[t]&&w)
{
dep[t]=dep[fr]+;
q.push(t);
if(t==T)return ;
}
}
}
return ;
} int dinic(int x,int flow)
{
if(x==T)return flow;
else
{
int rem=flow;
for(int i=head[x];i!=-&&rem;i=nex[i])
{
int t=to[i],w=wt[i];
if(dep[t]==dep[x]+&&w)
{
int tmp=dinic(t,min(rem,w));
if(!tmp)dep[t]=;
rem-=tmp;
wt[i]-=tmp,wt[i^]+=tmp;
}
}
return flow-rem;
}
} void dfs(int x,int p)
{
//cout<<x<<endl;
vst[x]=;
for(int i=head[x];i!=-;i=nex[i])
{
int t=to[i],w=wt[i];
if(t!=p&&w&&!vst[t])
{
dfs(t,x);
}
}
} void work()
{
int res=;
for(;bfs();)res+=dinic(S,INF);
cout<<sum-res<<endl;
dfs(S,-);
vector<int> tmp;
for(int i=;i<=m;++i)
{
//cout<<arr[i].x<<" "<<arr[i].y<<endl;
int u=arr[i].x,v=arr[i].y;
if(vst[u]&&!vst[v])
{
tmp.push_back(i);
}
}
cout<<tmp.size();
for(int i=;i<tmp.size();++i)
{
printf(" %d",tmp[i]);
}
cout<<endl;
} void release()
{
memset(vst,,sizeof(vst));
} int main()
{
//std::ios::sync_with_stdio(0);
//freopen("d:\\1.txt","r",stdin);
int casenum;
cin>>casenum;
//cout<<casenum<<endl;
for(int time=;time<=casenum;++time)
//for(int time=1;cin>>n>>m;++time)
{
printf("Case %d: ",time);
init();
work();
release();
}
return ;
}

hdoj3251的更多相关文章

随机推荐

  1. arcgis 画图工具

    arcgis 4.x系列JavaScript API在4.4及以前的版本对画图工具(Draw)是不支持的,自4.5版本后才提供Draw的类.相关连接:https://developers.arcgis ...

  2. Js数组去重方法总结

    //方法一 var arr = [1,23,1,1,1,3,23,5,6,7,9,9,8,5]; function removeDuplicatedItem(arr) { for(var i = 0; ...

  3. Vue2.0 入门 安装Vue-cli

    因为要用到npm命令先按装node.js 具体安装如下: 一.安装Node.js步骤 1.下载对应你系统的Node.js版本:https://nodejs.org/en/download/2.选安装目 ...

  4. 《ASP.NET Core In Action》读书笔记系列一 ASP.NET Core 的诞生

    最近打算系统学习一下asp.net  core ,苦于没有好的中文书藉,只好找来一本英文的 <ASP.NET Core In Action>学习.我和多数人一样,学习英文会明显慢于中文.希 ...

  5. 网络-05-端口号-F5-负载均衡设-linux端口详解大全--TCP注册端口号大全备

    [root@test1:Standby] config # [root@test1:Standby] config # [root@test1:Standby] config # [root@test ...

  6. C博客作业05--指针

    1. 本章学习总结 1.1 思维导图 1.2 本章学习体会及代码量学习体会 1.2.1 学习体会 这几周学习了指针,指针是C语言的一个重要的概念,也是特色之一.它可以通过对地址的访问来改变值,所以它的 ...

  7. CC2530的Flash

    CC2530F256内部集成一个增强型8051单片机,拥有8 KB SRAM和256 KB内部Flash存储器.内部Flash主要用来保存程序代码和常量数据.由于传统8051代码存储空间寻址范围只有6 ...

  8. JZ2440学习笔记之中断

    .extern main .text .global _start _start: @********************************************************* ...

  9. linux install Openvino

    recommend centos7 github Openvino tooltiks 1. download openvino addational installation for ncs2 ncs ...

  10. Bresenham算法

    1 算法原理 基本原理从某处摘得:设直线方程为yi+1=yi+k(xi+1-xi)+k.假设列坐标象素已经确定为xi,其行坐标为yi.那么下一个象素的列坐标为xi+1,而行坐标要么为yi,要么递增1为 ...