比赛 20120710 评测结果 AAAAAAAAAA
题目名称 三元限制最短路 最终得分 100
用户昵称 Citron酱 运行时间 0.091 s
代码语言 C++ 内存使用 116.74 MiB
提交时间 2012-07-10 08:58:42
显示代码纯文本
#include <cstdio>

#define I_F "patha.in"
#define O_F "patha.out"

const int MAXn=3000;
const int MAXm=20000*2;
const long MAXk=100000;
const long MAXl=10000000;

struct edge
{
	int x;
	edge *next, *f;
};
struct rule
{
	int a,b;
	rule *next, *f;
};
struct que
{
	que *f;
	int x, d;
};

edge e_pool[MAXm];
edge *ep=e_pool;
rule r_pool[MAXk];
rule *rp=r_pool;
edge *map[MAXn]={NULL};
rule *rules[MAXn]={NULL};
que q[MAXl];
int n, ans=-1;

void Input();
void Bfs();
void Output(const que*);
void Output();

int main()
{
	Input();
	Bfs();
	Output();
	return 0;
}

void Input()
{
	int m, a, b;
	long k;
	edge *tempe;
	rule *tempr;
	freopen(I_F,"r",stdin);
	for (scanf("%d%d%ld",&n,&m,&k); m>0; --m)
	{
		scanf("%d%d",&a,&b);
		--a, --b;
		tempe=map[a];
		map[a]=ep++;
		map[a]->x=b;
		map[a]->f=NULL;
		map[a]->next=tempe;
		if (tempe!=NULL)
			tempe->f=map[a];
		tempe=map[b];
		map[b]=ep++;
		map[b]->x=a;
		map[b]->f=NULL;
		map[b]->next=tempe;
		if (tempe!=NULL)
			tempe->f=map[b];
	}
	for (; k>0; --k)
	{
		scanf("%d%d%d",&a,&b,&m);
		--a;
		--b;
		--m;
		tempr=rules[m];
		rules[m]=rp++;
		rules[m]->a=a;
		rules[m]->b=b;
		rules[m]->f=NULL;
		rules[m]->next=tempr;
		if (tempr!=NULL)
			tempr->f=rules[m];
	}
}

void Bfs()
{
	bool flag;
	long now=0, tail=1;
	q[0].x=0;
	q[0].f=NULL;
	q[0].d=0;
	while (ans==-1 && tail<MAXl-n && now<tail)
	{
		for (edge *i=map[q[now].x]; i!=NULL && ans==-1; i=i->next)
		{
			flag=true;
			if (q[now].f!=NULL)
				for (rule *j=rules[i->x]; flag && j!=NULL; j=j->next)
					if (j->b==q[now].x && j->a==q[now].f->x)
					{
						flag=false;
						if (j->next!=NULL)
							j->next->f=j->f;
						if (j->f!=NULL)
							j->f->next=j->next;
						else
							rules[i->x]=j->next;
					}
			if (flag)
			{
				q[tail].x=i->x;
				q[tail].d=q[now].d+1;
				q[tail].f=&q[now];
				if (i->x==n-1)
					ans=tail;
				++tail;
				if (i->next!=NULL)
					i->next->f=i->f;
				if (i->f!=NULL)
					i->f->next=i->next;
				else
					map[q[now].x]=i->next;
			}
		}
		++now;
	}
}

void Output(const que *s)
{
	if (s->f!=NULL)
		Output(s->f);
	printf("%d ",s->x+1);
}

void Output()
{
	freopen(O_F,"w",stdout);
	printf("%d\n",q[ans].d);
	if (q[ans].f!=NULL)
		Output(q[ans].f);
	printf("%d\n",q[ans].x+1);
}