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

using namespace std;

int N,M,K,G[3010][3010],q[100010],pre[100010],dist[100010];
bool Map[3010][3010];

void print(int u)
{
	if(u)
		print(pre[u]);
	else
		return;
	printf("%d ",q[u]);
}

bool check(int x,int y)
{
	if(G[q[pre[x]]][q[x]]==y)
		return false;
	return true;
}

void bfs()
{
	int head=0,tail=1;
	q[1]=1;
	while(head!=tail)
	{
		head++;
		int u=q[head];
		if(u==N)
		{
			printf("%d\n",dist[head]);
			print(head);
			return;
		}
		for(int i=1;i<=N;i++)
			if(i!=u&&Map[i][u]&&check(head,i))
			{
				tail++;
				q[tail]=i;
				pre[tail]=head;
				dist[tail]=dist[head]+1;
				Map[i][u]=false;
			}
	}
}

int main()
{
	freopen("patha.in","r",stdin);
	freopen("patha.out","w",stdout);
	scanf("%d%d%d",&N,&M,&K);
	for(int i=1;i<=M;i++)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		Map[a][b]=true;
		Map[b][a]=true;
	}
	for(int i=1;i<=K;i++)
	{
		int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		G[a][b]=c;
	}
	bfs();
	return 0;
}