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 ...
随机推荐
- PAT 解题报告 1048. Find Coins (25)
1048. Find Coins (25) Eva loves to collect coins from all over the universe, including some other pl ...
- 遇到could not find developer disk image 问题怎么解决
一般是设备的版本低于或者高于当前的xcode
- C++Primer 第六章
//1.我们通过调用运算符来执行函数.调用运算符的形式是一对圆括号,他作用于一个表达式,该表达式是一个函数或者指向函数的指针.圆括号之内是用逗号分隔的实参列表,用于初始化函数形参.调用表达式的类型就是 ...
- JQuery权限管理
<title></title> <script src="JS/jquery-1.7.1.js"></script> <scr ...
- fread与fwrite的自我理解
size_t fread(void* buff,size_t size,size_t count,FILE* stream) 参数1:读取到该buff所指向的内存空间中 参数2:每次读取的字节数,单 ...
- Java实现数组按数值大小排序
package shb.java.test; /** * 比较数组中元素的大小,按从大到小顺序排列. * @Package:shb.java.test * @Description: * @autho ...
- 一个fork()系统调用的问题
转载:http://coolshell.cn/articles/7965.html 题目:请问下面的程序一共输出多少个“-”? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
- 关于ScrollView中嵌套listview焦点滑动问题 解决
(第三种,第四种简单推荐使用) 在这里我要提出的是,listview能滚动的前提是:当listview本身的高度小于listview里的子view. 第一种方法 只需在MainActivity中 找到 ...
- 文字处理TX Text Control X10独家揭秘(二):图像占位符合并
在前面一篇文章<TX Text Control X10独家揭秘(一):数据源自动处理>中已经对即将发布的TX Text Control X10的数据源自动处理做了一些了解,接下来述说它的图 ...
- android 项目学习随笔八(xUtils的BitmapUtils模块)
xUtils的BitmapUtils模块: 加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象: 支持加载网络图片和本地图片: 内存管 ...