记录编号 192080 评测结果 AAAAAAAAAAAAAAAA
题目名称 [CEOI1997]参观洞穴 最终得分 100
用户昵称 Gravatarmikumikumi 是否通过 通过
代码语言 C++ 运行时间 0.056 s
提交时间 2015-10-09 19:03:11 内存使用 0.56 MiB
显示代码纯文本
#include<cstdio>
#include<deque>
#include<iostream>
using namespace std;
const int SIZEN=510,maxn=0x7fffffff/2;
int N,K,ma=maxn;
int ans[SIZEN]={0},nowans[SIZEN]={0};
bool visit[SIZEN]={0};
deque<pair<int,int> > s[SIZEN];
void read()
{
	scanf("%d%d",&N,&K);
	int fr,to,C;
	for(int i=1;i<=3*N/2;i++)
	{
		scanf("%d%d%d",&fr,&to,&C);
		s[fr].push_back(make_pair(to,C));
		s[to].push_back(make_pair(fr,C));
	}
}
bool check(int fa,int x)
{
	for(int i=0;i<s[fa].size();i++)
	{
		int v=s[fa][i].first;
		if(visit[v]||v==x) continue;
		int cnt=0;
		for(int j=0;j<s[v].size();j++) 
		{
			int w=s[v][j].first;
			if(visit[w]&&w!=1&&w!=N) cnt++;
		}
		if(cnt>=2) return 1;
	}
	return 0;
}
bool connect(int x,int y)
{
	for(int i=0;i<s[x].size();i++)
		if(s[x][i].first==y) return 1;
	return 0;
}
void dfs(int x,int tot,int now,int fa,int last)//last为最后出现的一个外房间
{
	if(now>ma) return;
	nowans[tot]=x;
	if(tot==N) 
	{
		ma=now;
		for(int i=1;i<=N;i++) ans[i]=nowans[i];
		return;
	}
	if(check(fa,x)) return;
	visit[x]=1;
	int P=0;
	for(int i=0;i<s[x].size();i++)
	{
		int v=s[x][i].first;
		P=last;
		if(visit[v]==0)
		{
			if(v<=K)
			{
				if(connect(last,v)) P=v;
				else continue;
			}
			if(s[x][i].second==1) dfs(v,tot+1,now+1,x,P);
			else dfs(v,tot+1,now,x,P);
		}
	}
	visit[x]=0;
}
void work()
{
	dfs(1,1,0,0,1);
	for(int i=1;i<=N;i++) printf("%d ",ans[i]);
}
int main()
{
	freopen("cave.in","r",stdin);
	freopen("cave.out","w",stdout);
	read();
	work();
	return 0;
}