Friendship
Friendship
Time Limit: 2000MS Memory Limit: 20000K
Total Submissions: 9824 Accepted: 2720
Description
In modern society, each person has his own friends. Since all the people are very busy, they communicate with each other only by phone. You can assume that people A can keep in touch with people B, only if
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
The first line of the input contains three integers N (2<=N<=200), S and T ( 1 <= S, T <= N , and S is not equal to T).Each of the following N lines contains N integers. If i knows j’s number, then the j-th number in the (i+1)-th line will be 1, otherwise the number will be 0.
You can assume that the number of 1s will not exceed 5000 in the input.
Output
If there is no way to make A lose touch with B, print “NO ANSWER!” in a single line. Otherwise, the first line contains a single number t, which is the minimal number you have got, and if t is not zero, the second line is needed, which contains t integers in ascending order that indicate the number of people who meet bad things. The integers are separated by a single space.
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
Source
POJ Monthly
题意:给不同的人之间的联系,问至少有多少人遇到糟糕的事情会使S,T之间断开联系;
这个题需要拆点,将点拆成(i,i+N),之间的容量为一,遇到糟糕的事情就是自己与自己失去联系,通过最大流可以判断最小割,然后枚举点找字典序最最小的.
#include <map>
#include <cmath>
#include <queue>
#include <stack>
#include <string>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF =0x3f3f3f3f;
const double eps =1e-8;
const int Max =3000;
struct node
{
int cap;
int flow;
} Map[500][500];
int Set[500];
int Du[555];
bool vis[555];
int S,T,N;
int s,t;
void AddEdge(int u,int v,int w)
{
Map[u][v].cap = w;
}
bool BFS()
{
memset(Du,0,sizeof(Du));
memset(vis,false,sizeof(vis));
queue<int>Q;
Du[s]=1;
vis[s]=true;
Q.push(s);
while(!Q.empty())
{
int u=Q.front();
Q.pop();
for(int i=0; i<=t; i++)
{
if(!vis[i]&&Map[u][i].cap>Map[u][i].flow)
{
vis[i]=true;
Du[i]=Du[u]+1;
Q.push(i);
}
}
}
return vis[t];
}
int DFS(int star,int num)
{
if(star==t)
{
return num;
}
int a=0;
int ant;
for(int i=0; i<=t; i++)
{
if(Du[i]==Du[star]+1&&Map[star][i].cap>Map[star][i].flow)
{
if(ant=DFS(i,min(num,Map[star][i].cap-Map[star][i].flow)))
{
Map[star][i].flow+=ant;
Map[i][star].flow-=ant;
num-=ant;
a+=ant;
if(num==0)
{
break;
}
}
}
}
return a;
}
void Dinic()
{
int ans=0;
while(BFS())
{
ans+=DFS(0,INF);
}
printf("%d\n",ans);
if(!ans)
{
return ;
}
int cut=0;
int tmp=ans;
for(int i=1; i<=N&&tmp; i++)
{
if(i==S||i==T)
{
continue;
}
if(Map[i][i+N].flow==0)
{
continue;
}
Map[i][i+N].cap=0;
for(int a=1; a<=t; a++)
{
for(int b=1; b<=t; b++)
{
Map[a][b].flow=0;
}
}
ans=0;
while(BFS())
{
ans+=DFS(0,INF);
}
if(ans!=tmp)
{
Set[cut++]=i;
tmp=ans;
}
else
{
Map[i][i+N].cap=1;
}
}
for(int i=0; i<cut; i++)
{
if(i)
{
printf(" ");
}
printf("%d",Set[i]);
}
printf("\n");
}
int main()
{
int data;
while(~scanf("%d %d %d",&N,&S,&T))
{
memset(Map,0,sizeof(Map));
s=0;
t=N*2+1;
AddEdge(s,S,INF);
AddEdge(T+N,t,INF);
for(int i=1; i<=N; i++)
{
AddEdge(i,i+N,1);
for(int j=1; j<=N; j++)
{
scanf("%d",&data);
if(data)
{
AddEdge(i+N,j,INF);
}
}
}
AddEdge(S,S+N,INF);
AddEdge(T,T+N,INF);
if(!Map[S+N][T].cap)
{
Dinic();
}
else
{
printf("NO ANSWER!\n");
}
}
return 0;
}
Friendship的更多相关文章
- POJ 1815 Friendship
Friendship Time Limit: 2000MS Memory Limit: 20000K Total Submissions: 10626 Accepted: 2949 Descr ...
- HDU 5578 Friendship of Frog 水题
Friendship of Frog Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.ph ...
- WordPress BuddyPress Extended Friendship Request插件跨站脚本漏洞
漏洞名称: WordPress BuddyPress Extended Friendship Request插件跨站脚本漏洞 CNNVD编号: CNNVD-201307-609 发布时间: 2013- ...
- Friendship of Frog(水题)
Friendship of Frog Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- Codeforces 791B Bear and Friendship Condition(DFS,有向图)
B. Bear and Friendship Condition time limit per test:1 second memory limit per test:256 megabytes in ...
- codeforces round #405 B. Bear and Friendship Condition
B. Bear and Friendship Condition time limit per test 1 second memory limit per test 256 megabytes in ...
- Bear and Friendship Condition-HZUN寒假集训
Bear and Friendship Condition time limit per test 1 secondmemory limit per test 256 megabytesinput s ...
- POJ 1815 Friendship (Dinic)
Friendship Time Limit: 2000MS Memory Limit: 20000K Total Submissions: 11429 Accepted: 3173 Descr ...
- 8. American Friendship 美国式的友谊
8. American Friendship 美国式的友谊 (1) Americans usually consider themselves a friendly people.Their frie ...
随机推荐
- segger 烧写superboot
选择友善之臂的superboot ,然后才能运行minitool工具进行下载系统,boot->kernel->root nand flash 启动方式,minitool烧写 bootl ...
- 网易免费邮件开启smtp教程
网易免费邮件开启smtp教程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们在部署zabbix邮件报警中可能会用到163.com.那么我们如何去开启smtp服务呢? 1 ...
- [Reprint]C++函数前和函数后加const修饰符区别
c++中关于const的用法有很多,const既可以修饰变量,也可以函数,不同的环境下,是有不同的含义.今天来讲讲const加在函数前和函数后面的区别.比如: 01 #include<iostr ...
- [原创]java WEB学习笔记53:Struts2学习之路---前奏:使用 Filter 作为控制器的 MVC
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- MVC4 下DropDownList使用方法
与MVC3相比,差别很大: 表现形式一: public ActionResult Main() { List<SelectListItem> items = new List<Sel ...
- 阿里 drds 分布式数据库分节点查询
mybatis 模式下,xml 中写法 <select id="selectFailDetailOneNode" resultMap="BaseResultMap& ...
- mac ruby rails安装(使用rvm)
mac的场合: which ruby -> /usr/bin/ruby -> 这是mac自带的ruby,我们希望能用管理ruby的版本. 安装rvm curl -L https://get ...
- PAT乙级 1007. 素数对猜想 (20)
1007. 素数对猜想 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 让我们定义 dn 为:dn = ...
- 关于 ActiveMQ 的消息模式
1.JMS Queue 执行 load balancer语义:一条消息仅能被一个 consumer(消费者) 收到.如果在 message 发送的时候没有可用的consumer,那么它将被保存一直到能 ...
- 记录下标准网线水晶头的做法 100m/1G
注意, 网线分平行线(也叫直连线)和交叉线. 用法见下图 .也就是相同层内用交叉线, 不同层用平行线. 所以两台电脑,两台非级联并行的路由才用交叉线,一般我们都用平行线即可. 千兆网和百兆网不同: ...