T1 P2057 [SHOI2007] 善意的投票
题目
https://www.luogu.com.cn/blog/OnMyOwn/OnMyOwn
https://www.luogu.com.cn/problem/P2057
题目: 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉。对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神。虽然每个人都有自己的主见,但是为了照顾一下自己朋友的想法,他们也可以投和自己本来意愿相反的票。我们定义一次投票的冲突数为好朋友之间发生冲突的总数加上和所有和自己本来意愿发生冲突的人数。每位小朋友应该怎样投票,才能使冲突数最小?
断点概述:
1,最小割建模困难,没有想到
2,对组合的处理欠思考,
思想概述:
code
T2 P2857 [USACO 06FEB ]Steady Cow Assignment G
题目
https://www.luogu.com.cn/problem/P2857
https://www.luogu.com.cn/blog/387840/solution-p3033
给出 N条 平行于坐标轴的线段,要你选出尽量多的线段使得这些线段两两没有交点(顶点也算),横的与横的,竖的与竖的线段之间保证没有交点,输出最多能选出多少条线段。
输入:(x1,y1,x2,y2)
断点概述:
1,建模在割,试图对所有点进行分类
2,读题不细,对同方向交点进行了讨论
3,输入坐标不保证顺序,需要满足我们的(不妨设)
思想概述:
1,二分图,一个方向一个,任意线段有交点就建边
2,求得最小割,删去这些匹配,也就是在这些有交点的线段中删去其一,即可分成两个独立集合
3,按照顺序类别枚举边,使得判断函数简单
code
int main()
{
Mset(h,-1);
read(n);
rep(i,1,n)
{
int x1,x2,y1,y2;
read(x1);read(y1); read(x2); read(y2);
if(x1==x2)
{
if(y1>=y2)swap(y1,y2);
px[++cx]={x1,y1,x2,y2};
}
else
{
if(x1>=x2)swap(x1,x2);
py[++cy]={x1,y1,x2,y2};
}
}
S = N -1;
T = N -2;
rep(i,1,cx)
{
rep(j,1,cy)
{
if(check(px[i],py[j]))add(i,cx+j,1);
}
}
rep(i,1,cx)add(S,i,1);
rep(i,1,cy)add(i+cx,T,1);
wri(n-Dinic());
return 0;
}
T2 P1231 教辅的组成
https://www.luogu.com.cn/problem/P1231
https://siyuan.blog.luogu.org/solution-p1231
题目:三分图匹配
断点概述:
1,三分图建模完成
2,中间节点流量限制没想到(限制在边上)
3,编号思维速度慢
code
int main()
{
Mset(h,-1);
/// 书 1 - n
/// 书出 n+1 - n+n
/// 练习 2*n+1 - 2*n+m
/// 答案 2*n+m+1 - 2*n+m+k
read(n); read(m); read(k);
int cnt;
S = N-1;
T = N-2;
read(cnt);
rep(i,1,cnt)
{
int x,y;
read(x); read(y);
add(2*n+y,x,1);
}
rep(i,1,n)add(i,i+n,1);
read(cnt);
rep(i,1,cnt)
{
int x,y;
read(x); read(y);
add(x+n,2*n+y+m,1);
}
rep(i,1,m) add(S,i+2*n,1);
rep(i,1,k) add(i+2*n+m,T,1);
wri(Dinic());
}
断点概述:
int sol()
{
int ans= 0;
queue<int>q;
q.push(S);
Mset(st,0);
while (q.size())
{
int top = q.front(); q.pop();
for(int i=h[top];~i;i=ne[i])
{
if(i%2==0 && f[i])
{
int v=e[i];
if(!st[v])st[v]=1,q.push(v);
}
}
}
q.push(T);
while(q.size())
{
int top = q.front(); q.pop();
for(int i=h[top];~i;i=ne[i])
{
if(i%2)
{
int v=e[i];
//if(!st[v])st[v]=1,q.push(v);
.....
}
}
}
}
T1
- 求解割点,限制上点,联通性边连成INF
- 思考限制在点
https://www.luogu.com.cn/problem/P1345
int main()
{
Mset(h,-1);
read(n); read(m); read(S); read(T);
rep(i,1,n)
{
if(i==S||i==T) add(i,i+n,INF);
else add(i,i+n,1);
}
while (m--)
{
int a,b,c;
read(a); read(b);
add(b+n,a,INF);
add(a+n,b,INF);
}
int ans = Dinic();
cout<<ans;
}
T2
网络流定义,每次走最大流,性质开到ceil
int main()
{
Mset(h,-1);
read(n); read(m); read(k);
S = 1 ;
T = n ;
while (m--)
{
int a,b,c;
read(a); read(b); read(c);
add(a,b,c);
//add(b,a,c);
}
int ans = Dinic();
if(ans)cout<<ans<<" "<<(int)ceil((double)k/ans);
else puts("Orz Ni Jinan Saint Cow!");
}
T3
https://www.luogu.com.cn/problem/P2071
二分图最大匹配
{
Mset(h,-1);
read(n);
S = 0;
T = N-1;
rep(i,1,2*n)
{
int x,y;
read(x); read(y);
add(S,i,1);
add(i+2*n,T,2);
add(i,x+2*n,1);
add(i,y+2*n,1);
}
int ans = Dinic();
cout<<ans;
}
T3
https://www.luogu.com.cn/problem/P2740
网络流可以处理正环和重复建边
int main()
{
Mset(h,-1);
read(m); read(n);
S = 1; T = n;
rep(i,1,m)
{
int x,y,z;
read(x); read(y); read(z);
add(x,y,z);
}
int ans = Dinic();
cout<<ans;
}
错误分析
int main()
{
int will[N];
Mset(h,-1);
read(n); read(m);
S = N -1 ; /// 表示0
T = N-2 ; /// 表示1
rep(i,1,n)
{
int x; read(x);
will[i]=x;
if(x)add(S,i,1), add(i,T,0);
else add(S,i,0), add(i,T,1);
}
rep(i,1,m)
{
int a,b;
read(a); read(b);
add(S,n+i*2,(will[a]==1) + (will[b]==1) );
add(n+i*2-1,T,(will[a]==0) + (will[a]==0) );
add(n+i*2,a,INF);
add(n+i*2,b,INF);
add(a,n+i*2-1,INF);
add(b,n+i*2-1,INF);
}
wri(Dinic());
}