您的位置:首页 > 其它

bzoj 2438: [中山市选2011]杀人游戏(Tarjan)

2018-02-15 23:10 477 查看

2438: [中山市选2011]杀人游戏

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 2907  Solved: 836

[Submit][Status][Discuss]

Description

一位冷血的杀手潜入 Na-wiat,并假装成平民。警察希望能在 N 个人里面,查出谁是杀手。警察能够对每一个人
进行查证,假如查证的对象是平民,他会告诉警察,他认识的人, 谁是杀手, 谁是平民。 假如查证的对象是杀
手, 杀手将会把警察干掉。现在警察掌握了每一个人认识谁。每一个人都有可能是杀手,可看作他们是杀手的概率是相同的。问:根据最优的情况,保证警察自身安全并知道谁是杀手的概率最大是多少?

Input

第一行有两个整数 N,M。 

接下来有 M 行,每行两个整数 x,y,表示 x 认识 y(y 不一定认识 x,例如胡锦涛同志) 。

Output

仅包含一行一个实数,保留小数点后面 6 位,表示最大概率。

Sample Input

5 4

1 2

1 3

1 4

1 5

Sample Output

0.800000

题目就是让你选择尽可能少的点使得能遍历图中至少n-1个点

就是强连通分量缩点之后入度为0的点的个数为x,答案就是(n-x)/n

不过有个坑,因为遍历至少n-1个点就行了,所以如果存在某个点满足入度为0,且它所有出边的点入度都>1

那么x要-1

#include<stdio.h>
#include<stack>
#include<string.h>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> G[100005], G2[100005];
stack<int> st;
int t, num, low[100005], vis[100005], time[100005], scc[100005], in[1000050];
void Trajan(int x)
{
int i, temp;
st.push(x);
vis[x] = 1;
low[x] = time[x] = ++t;
for(i=0;i<G[x].size();i++)
{
temp = G[x][i];
if(vis[temp]==0)
{
Trajan(temp);
low[x] = min(low[x], low[temp]);
}
else if(scc[temp]==0)
low[x] = min(low[x], time[temp]);
}
if(low[x]==time[x])
{
num++;
while(st.empty()==0)
{
temp = st.top();
st.pop();
scc[temp] = num;
if(temp==x)
break;
}
}
}
int main(void)
{
int n, m, i, j, x, y, temp, ans;
scanf("%d%d", &n, &m);
for(i=1;i<=m;i++)
{
scanf("%d%d", &x, &y);
G[x].push_back(y);
}
for(i=1;i<=n;i++)
{
if(vis[i]==0)
Trajan(i);
}
for(i=1;i<=n;i++)
{
for(j=0;j<G[i].size();j++)
{
temp = G[i][j];
if(scc[i]!=scc[temp])
G2[scc[i]].push_back(scc[temp]);
}
}
for(i=1;i<=num;i++)
{
for(j=0;j<G2[i].size();j++)
in[G2[i][j]]++;
}
ans = 0;
for(i=1;i<=num;i++)
{
if(in[i]==0)
ans++;
}
memset(in, 0, sizeof(in));
for(i=1;i<=n;i++)
{
for(j=0;j<G[i].size();j++)
in[G[i][j]]++;
}
for(i=1;i<=n;i++)
{
if(in[i]==0)
{
for(j=0;j<G[i].size();j++)
{
if(in[G[i][j]]<=1)
break;
}
if(j==G[i].size())
{
ans--;
break;
}
}
}
printf("%.6f\n", 1.0*(n-ans)/n);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: