您的位置:首页 > 产品设计 > UI/UE

UVALive 6432 Influence 搜索 剪枝

2016-09-11 19:05 316 查看
//题目:http://www.51isoft.com/v3/external/64/6432.pdf

//参考博客:http://blog.csdn.net/q295657451/article/details/39211067

#include <stdio.h>
#include <string>
#include <cstring>
#include <queue>
#include <algorithm>
#include <functional>
#include <vector>
#include <sstream>
#include <iomanip>
#include <math.h>
#include <iostream>
#include <sstream>
#include <time.h>
#include <stack>
#include <set>
#include <map>
#include <time.h>
#include <bitset>
using namespace std;
const int MAX_N = 5005;
vector<int> G[MAX_N];
bitset<MAX_N> bi[MAX_N];
bool vis[MAX_N], isX[MAX_N];
void init()
{
for (int i = 0; i < MAX_N; ++i)
{
G[i].clear();
bi[i].reset();
bi[i].set(i);
vis[i] = false;
}
}
void dfs(int cur)
{
vis[cur] = true;
int size = G[cur].size();
for (int i = 0; i < size; i++)
{
int now = G[cur][i];
if (!vis[now]) dfs(now);
bi[cur] |= bi[now];
}
}
int main()
{
int n, k, num, x;
while (~scanf("%d %d", &n, &k))
{
init();
for (int i = 0; i < k; ++i)
{
scanf("%d", &num);
isX[num] = true;
}
string s;
for (int i = 1; i <= n; ++i)
{
scanf("%d", &num);
getline(cin, s);
stringstream ss(s);
while (ss >> x) G[num].push_back(x);
}
int ans = 0, id;
for (int i = 1; i <= n; ++i)
{
if (!vis[i]) dfs(i);
int tmp = bi[i].count();
if (isX[i] && (tmp > ans || (tmp == ans && i < id)))
{
ans = tmp;
id = i;
}
}
printf("%d\n", id);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: