POJ 1815 Friendship (Dinic)
| Time Limit: 2000MS | Memory Limit: 20000K | |
| Total Submissions: 11429 | Accepted: 3173 |
Description
1. A knows B's phone number, or
2. A knows people C's phone number and C can keep in touch with B.
It's assured that if people A knows people B's number, B will also know A's number.
Sometimes, someone may meet something bad which makes him lose touch with all the others. For example, he may lose his phone number book and change his phone number at the same time.
In this problem, you will know the relations between every two among N people. To make it easy, we number these N people by 1,2,...,N. Given two special people with the number S and T, when some people meet bad things, S may lose touch with T. Your job is to compute the minimal number of people that can make this situation happen. It is supposed that bad thing will never happen on S or T.
Input
You can assume that the number of 1s will not exceed 5000 in the input.
Output
If there is more than one solution, we give every solution a score, and output the solution with the minimal score. We can compute the score of a solution in the following way: assume a solution is A1, A2, ..., At (1 <= A1 < A2 <...< At <=N ), the score will be (A1-1)*N^t+(A2-1)*N^(t-1)+...+(At-1)*N. The input will assure that there won't be two solutions with the minimal score.
Sample Input
3 1 3
1 1 0
1 1 1
0 1 1
Sample Output
1
2
思路:
感谢llw大佬的神奇优化!!!!
耗时两天,终于AC了,总算是证明了自己的算法没有错误。
网上遍地都是拆点的题解,奈何我实在是太弱了,弱到无法想象的地步,实在是看不懂拆点应该要怎么拆,所以我被逼无奈选择了暴力。
那就是,限制一次dfs只能跑出容量为1的流,并将这条流上的所有点标记为不可用,直到一次Dinic结束。
以此取代拆点的操作,是完全可行的,其他的操作都大体相同
终于终于,体会到了AC的快乐,看着题解写出来的题,渐渐地成为了我自闭的根源
代码
邻接矩阵
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
using namespace std;
int mp[300][300];
int n,s,t;
const int inf = 2100000000;
int vis[400],num[400];
bool book[400]; struct edge
{
int u,v,next,w;
}e[400010];
int Head[400010],cur;
int ans[400010]; void add(int x,int y)
{ e[cur].u=x;
e[cur].v=y;
e[cur].next=Head[x];
e[cur].w=1;
Head[x]=cur;
cur++;
e[cur].u=y;
e[cur].v=x;
e[cur].next=Head[y];
e[cur].w=0;
Head[y]=cur;
cur++;
} bool bfs()
{
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++){
num[i]=Head[i];
}
vis[s]=1;
queue<int>q;
q.push(s);
int r=0;
while(!q.empty()){
int u=q.front();
q.pop();
int k=Head[u];
while(k!=-1){
if(!book[e[k].v]&&!vis[e[k].v]&&e[k].w){
vis[e[k].v]=vis[u]+1;
q.push(e[k].v);
}
k=e[k].next;
}
}
return vis[t];
} int dfs(int u)
{
if(u==t){return 1;} int &k=num[u];
while(k!=-1){
if(!book[e[k].v]&&vis[e[k].v]==vis[u]+1&&e[k].w){
int d=dfs(e[k].v);
e[k].w-=d;
e[k^1].w+=d;
if(d>0){book[u]=true;return 1;}
}
k=e[k].next;
}
return 0;
} void build()
{
cur=0;
memset(Head,-1,sizeof(Head));
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(mp[i][j]) add(i,j);
}
}
} int Dinic(int y)
{
memset(book,0,sizeof(book));
book[y]=1;
int ans=0;
while(bfs()){
int f;
while((f=dfs(s))>0){//llw大佬太强了orz orz orz
ans+=f;
}
}
return ans;
} inline void rebuild(int tt)
{
for(int i=0;i<=cur;i+=2){
if(e[i].v==tt||e[i].u==tt){e[i].w=e[i^1].w=0;}
else if(e[i^1].w!=0){
e[i].w=1;
e[i^1].w=0;
}
} }
int main()
{
scanf("%d%d%d",&n,&s,&t);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&mp[i][j]);
}
}
if(mp[s][t]==1){printf("NO ANSWER!\n");return 0;}
build();
int maxx=Dinic(0);
rebuild(0);
int num=0;
for(int i=1;i<=n;i++){
if(i==s||i==t){continue;}
int y=Dinic(i);
if(y<maxx){
ans[++num]=i;
maxx=y;
if(maxx==0){break;}
rebuild(i);
}
else rebuild(0);
}
if(num==0){printf("0\n");return 0;}
printf("%d\n",num);
for(int i=1;i<=num;i++){
if(i!=1){printf(" ");}
printf("%d",ans[i]);
}
printf("\n");
}
POJ 1815 Friendship (Dinic)的更多相关文章
- POJ 1815 Friendship (Dinic 最小割)
Friendship Time Limit: 2000MS Memory Limit: 20000K Total Submissions: 8025 Accepted: 2224 Descri ...
- POJ 1815 Friendship(字典序最小的最小割)
Friendship Time Limit: 2000MS Memory Limit: 20000K Total Submissions: 10744 Accepted: 2984 Descr ...
- POJ 1815 Friendship(最大流最小割の字典序割点集)
Description In modern society, each person has his own friends. Since all the people are very busy, ...
- POJ - 1815 Friendship (最小点割集)
(点击此处查看原题) 题目分析 题意:有n个人,编号记为1~n,n个人之间可能有人可以互相联系,如果A能和B联系,那么至少满足这两种情况之一:(1)A知道B的电话(2)A可以和C联系,并且C可以和B联 ...
- POJ 1815 Friendship(最小割+字典序输出割点)
http://poj.org/problem?id=1815 题意: 在现代社会,每个人都有自己的朋友.由于每个人都很忙,他们只通过电话联系.你可以假定A可以和B保持联系,当且仅当:①A知道B的电话号 ...
- POJ 3281 Dining (网络流)
POJ 3281 Dining (网络流) Description Cows are such finicky eaters. Each cow has a preference for certai ...
- POJ 2431 Expedition(探险)
POJ 2431 Expedition(探险) Time Limit: 1000MS Memory Limit: 65536K [Description] [题目描述] A group of co ...
- POJ 3414 Pots(罐子)
POJ 3414 Pots(罐子) Time Limit: 1000MS Memory Limit: 65536K Description - 题目描述 You are given two po ...
- POJ 1847 Tram (最短路径)
POJ 1847 Tram (最短路径) Description Tram network in Zagreb consists of a number of intersections and ra ...
随机推荐
- 老男孩python学习自修【第一天】文件IO用法
第一天 文件IO处理 1.读文件实例 file_split.python f = file('myFile.txt', 'r') for line in f.readlines(): line = ...
- 配置Web.config 元素CustomErrors
一.customErrors 元素 属性 说明 defaultRedirect 指定出错时将浏览器定向到的默认 URL.如果未指定该属性,则显示一般性错误. 可选的属性. URL 可以是绝对的(如 w ...
- 页面传递的都是string ; 每个标签要有name的原因是为了取值 因为传递给后台是键值对的形式
页面传递的都是string ; 每个标签要有name的原因是为了取值 因为传递给后台是键值对的形式
- vuejs 单文件组件.vue 文件
vuejs 自定义了一种.vue文件,可以把html, css, js 写到一个文件中,从而实现了对一个组件的封装, 一个.vue 文件就是一个单独的组件.由于.vue文件是自定义的,浏览器不认识,所 ...
- JarvisOJ Basic Base64?
GUYDIMZVGQ2DMN3CGRQTONJXGM3TINLGG42DGMZXGM3TINLGGY4DGNBXGYZTGNLGGY3DGNBWMU3WI=== 题目非常具有迷惑性,我一开始以为就是一 ...
- js 异步代码
这段时间一直在用node.js做毕设的后台,所以需要一些异步代码操作,主要的异步方式有:Promise.Generator 和 async / await,但下面主要讲 Promise 和 async ...
- python 模块之-shelve
shelve模块比pickle模块简单,只有一个open函数,返回类似字典的对象,可读可写;key必须为字符串,而值可以是python所支持的数据类型 import shelve f = shelve ...
- BZOJ4653 [NOI2016] 区间 【线段树】
题目分析: 首先思考一个二分答案的做法.我们可以注意到答案具有单调性,所以可以二分答案. 假设当前二分的答案是$ k $.那么按照大小顺序插入每个区间,同时在末端删除会对答案产生影响的区间.这里不妨用 ...
- 洛谷P1434滑雪题解及记忆化搜索的基本步骤
题目 滑雪是一道dp及记忆化搜索的经典题目. 所谓记忆化搜索便是在搜索的过程中边记录边搜索的一个算法. 当下次搜到这里时,便直接使用. 而且记忆化搜索一定要满足无后效性,为什么呢,因为如果不满足无后效 ...
- 个人整理的数组splay板子,指针的写的太丑了就不放了。。
splay的板子.. 由于被LCT榨干了..所以昨天去学了数组版的splay,现在整理一下板子.. 以BZOJ3224和3223为例题..暂时只有这些,序列的话等有时间把维修序列给弄上来!! BZOJ ...