比赛 20120710 评测结果 AAAAAAAAAA
题目名称 三元限制最短路 最终得分 100
用户昵称 Makazeu 运行时间 0.201 s
代码语言 C++ 内存使用 60.54 MiB
提交时间 2012-07-10 10:34:46
显示代码纯文本
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <queue>
#include <set>
#include <algorithm>
using namespace std;
typedef unsigned short int usint;
const int MAXN=3003;
const usint INF=65500;
int N,M,K;
vector<int> map[MAXN];
int pre[MAXN][MAXN];

class Funou{public:int a,b,c;};
class cmp
{
public:
	bool operator() (const Funou&a,const Funou&b)
	{
		if(a.a!=b.a) return a.a<b.a;
		if(a.b!=b.b) return a.b<b.b;
		return a.c<b.c;
	}
};
set<Funou,cmp> Fhash;
set<Funou,cmp> :: iterator iter;
bool flag[MAXN][MAXN];
usint dist[MAXN][MAXN];
class Queue
{
public:
	int mae,now;
};
queue<Queue> q;

inline void init()
{
	int a,b,c;
	scanf("%d %d %d\n",&N,&M,&K);
	for(int i=1;i<=M;i++)
	{
		scanf("%d %d\n",&a,&b);
		map[a].push_back(b);
		map[b].push_back(a);
	}
	for(int i=1;i<=K;i++)
	{
		scanf("%d %d %d",&a,&b,&c);
		Fhash.insert((Funou){a,b,c});
	}
}

inline void bfs()
{
	for(int i=1;i<=N;i++) 
		for(int j=1;j<=N;j++)
			flag[i][j]=0,dist[i][j]=INF;
	dist[0][1]=0; flag[0][1]=1;
	q.push((Queue){0,1});
	Queue tmp;
	int tm,tp,tv,np;
	while(q.size())
	{
		tmp=q.front(); q.pop();
		tm=tmp.mae,tp=tmp.now; tv=dist[tm][tp];
		for(unsigned int i=0;i<map[tp].size();i++)
		{
			np=map[tp][i]; if(flag[tp][np]) continue;
			if(Fhash.find((Funou){tm,tp,np})!=Fhash.end()) continue;
			flag[tp][np]=1; dist[tp][np]=tv+1; q.push((Queue){tp,np});
			pre[tp][np]=tm;
		}
	}
}

inline void output()
{
	int now,ans=INF;
	for(int i=1;i<=N;i++) 
		if(dist[i][N]<ans && Fhash.find((Funou){pre[i][N],i,N})==Fhash.end())
			ans=dist[i][N],now=i;
	printf("%d\n",ans); int top=2;
	int num[MAXN]; num[1]=N; num[2]=now;
	while(now!=1)
	{
		now=pre[num[top]][num[top-1]];
		num[++top]=now;
	}
	for(int i=top;i>=1;i--) printf("%d ",num[i]);
}

int main()
{
	freopen("patha.in","r",stdin);
	freopen("patha.out","w",stdout);
	init();
	bfs();
	output();
	return 0;
}