【dfs】Election of Evil

版权声明:版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/YT201758501112/article/details/89186543

题目描述

Dylan is a corrupt politician trying to steal an election. He has already used a mind-control technique to enslave some set U of government representatives. However, the representatives who will be choosing the winner of the election is a different set V . Dylan is hoping that he does not need to use his mind-control device again, so he is wondering which representatives from V can be convinced to vote for him by representatives from U.
Luckily, representatives can be persuasive people. You have a list of pairs (A, B) of represenatives, which indicate that A can convice B to vote for Dylan. These can work in chains; for instance, if Dylan has mind-controlled A, A can convince B, and B can convince C, then A can effectively convince C as well.

输入

The first line contains a single integer T (1 ≤ T ≤ 10), the number of test cases. The first line of each test case contains three space-separated integers, u, v, and m (1 ≤ u, v, m ≤ 10,000). The second line contains a space-separated list of the u names of representatives in U. The third line contains a space-separated list of the v names of representatives from V . Each of the next m lines contains a pair of the form A B, where A and B are names of two representatives such that A can convince B to vote for Dylan. Names are strings of length between 1 and 10 that only consists of lowercase letters (a to z).

输出

For each test case, output a space-separated list of the names of representatives from T who can be convinced to vote for Dylan via a chain from S, in alphabetical order.

样例输入

复制样例数据

2
1 1 1
alice
bob
alice bob
5 5 5
adam bob joe jill peter
rob peter nicole eve saul
harry ron
eve adam
joe chris
jill jack
jack saul

样例输出

bob
peter saul

提示

In the second test case, Jill can convince Saul via Jack, and Peter was already mind-controlled.

题目大意:

先是输入样例的组数,对于每组样例,先输入三个整数u,v,m,下面一行输入u个名称,其下一行输入v个名称,然后是m组说服关系,每行输入两个名称s1,s2,若u中的一个人能够说服v中的人投票给Dylan,则将v中此人记录下来,最后将答案按照字典序输出,同时有一点需注意,若假如某人即在u中又在v中,则他肯定能说服自己。

解题思路:

我们可以根据m行说服关系建一个有向图(树),不难发现,若以u中的一个人为根节点,那么他肯定能说服在以他为根的路径上的所有在v中的人都能被他说服投票给Dylan,所以可以通过dfs寻找这样的人,把人名存入set中,最后输出即可。

代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <bitset>
#include <set>
#include <utility>
#include <sstream>
#include <iomanip>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define inf 0x3f3f3f3f
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define lep(i,l,r) for(int i=l;i>=r;i--)
#define ms(arr) memset(arr,0,sizeof(arr))
//priority_queue<int,vector<int> ,greater<int> >q;
const int maxn = (int)1e5 + 5;
const ll mod = 1e9+7;
map<string,int> m;
bool vis[200100];
set<string> ss;
vector<int> mapp[400100];
map<int,string> str;
int l,r;
void dfs(int x) {
	if(mapp[x].size()==0) return;
	for(int i=0;i<mapp[x].size();i++) {
		if(vis[mapp[x][i]]==false) {
/*			cout<<str[x]<<" "<<str[mapp[x][i]]<<endl;
*/			vis[mapp[x][i]]=true;
			if(mapp[x][i]>=l&&mapp[x][i]<=r) ss.insert(str[mapp[x][i]]);
			dfs(mapp[x][i]);
		}
	}

}
int main() 
{
    #ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    #endif
    //freopen("out.txt", "w", stdout);
    ios::sync_with_stdio(0),cin.tie(0);
    int t;
    cin>>t;
    while(t--) {
    	int u,v,mm;
    	rep(i,1,40000) mapp[i].clear();
    	string s;
    	m.clear();
    	memset(vis,false,sizeof vis);
    	ss.clear();
    	int cnt=0;
    	cin>>u>>v>>mm;
    	rep(i,1,u) {cin>>s;cnt++;m[s]=cnt;str[cnt]=s;}
    	l=cnt+1;
    	rep(i,1,v) {
    		cin>>s;
    		if(m[s]!=0) {
    			ss.insert(s);
    		}
    		else {
    			cnt++;
    			m[s]=cnt;
    			str[cnt]=s;
    		}
    	}
    	r=cnt;
    	string s1,s2;
    	rep(i,1,mm) {
    		cin>>s1>>s2;
    		if(m[s1]==0) {cnt++;m[s1]=cnt;str[cnt]=s1;}
    		if(m[s2]==0) {cnt++;m[s2]=cnt;str[cnt]=s2;}
    		mapp[m[s1]].push_back(m[s2]);
    	}
    	rep(i,1,u) {
    		if(vis[i]==false) {
    			vis[i]=true;
    			dfs(i);
    		}
    	}
    	set<string>::iterator it1;
    	for(it1=ss.begin();it1!=ss.end();it1++) cout<<*it1<<" ";
    	cout<<endl;
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/YT201758501112/article/details/89186543