ZOJ Unrequited Love 图论+STL

题意:给定了一个有向图。然后给了一系列的操作,这些操作是去图中的某些点,并且保留这些点之间的边,构成个新图,然后找这个图中入度为0,初读为所有点个数的点。

做法:唉,过了很久才发现这样的点最多一个,细想啊。。。还有VC6.0真是可恶的东西...

#pragma warning(disable:4786)
#include<cstdio>
#include<cstring>
#include<string>
#include<utility>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
const int LMT=60002;
vector<int>gra[LMT];
map<string,int>nm;
vector<int>par;
string nm2[LMT];
int ans,cnt;
//只有一个KING啊!!!!
void init(void)
{
	par.clear();
}
int main()
{
	int i,j,T,n,m,q,num,u,v;
	char na[25];
	string name;
	scanf("%d",&T);
	while(T--)
	{
		nm.clear();cnt=0;
		for(i=0;i<LMT;i++)gra[i].clear();
		scanf("%d%d%d",&n,&m,&q);
		for(i=0;i<n;i++)
		{
			scanf("%s",na);
			name=string(na);
			if(nm.find(name)==nm.end())
			{
				nm.insert(make_pair(name,cnt));
				nm2[cnt]=name;
				cnt++;
			}
			u=nm[name];
			scanf("%d",&num);
			for(j=0;j<num;j++)
			{
				scanf("%s",na);
				name=string(na);
				if(nm.find(name)==nm.end())
				{
					nm.insert(make_pair(name,cnt));
					nm2[cnt]=name;
				     cnt++;
				}
				v=nm[name];
				gra[u].push_back(v);
			}
			sort(gra[u].begin(),gra[u].end());
		}
		for(i=0;i<m;i++)
		{
			scanf("%s",na);
			name=string(na);
			if(nm.find(name)==nm.end())
			{
				nm.insert(make_pair(name,cnt));
				nm2[cnt]=name;
				     cnt++;
			}
			u=nm[name];
			scanf("%d",&num);
			for(j=0;j<num;j++)
			{
				scanf("%s",na);
				name=string(na);
				if(nm.find(name)==nm.end())
				{
					nm.insert(make_pair(name,cnt));
					nm2[cnt]=name;
				     cnt++;
				}
				v=nm[name];
				gra[u].push_back(v);
			}
			sort(gra[u].begin(),gra[u].end());
		}
		while(q--)
		{
			init();
			scanf("%d",&num);
			while(num--)
			{
			   scanf("%s",na);
			  name=string(na);
			   par.push_back(nm[name]);
			}
			for(i=0;i<(int)par.size();i++)
			{
				for(j=0;j<(int)par.size();j++)
				{
					if(i==j)continue;
					if(!binary_search(gra[par[i]].begin(),gra[par[i]].end(),par[j])
						||binary_search(gra[par[j]].begin(),gra[par[j]].end(),par[i]))
						break;
				}
				if(j==(int)par.size())
				{
					printf("1 %s\n",nm2[par[i]].c_str());
					break;
				}
			}
			if(i==(int)par.size())puts("0");
		}
		printf("\n");
	}
	return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值