比赛 20110722 评测结果 AAAAAAAAAAAAAWWWW
题目名称 网络探测 最终得分 76
用户昵称 Pom 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-07-22 11:43:16
显示代码纯文本
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>

using namespace std;

const int MAXN=1111;
const int MAXM=MAXN*MAXN*2;
const int M=MAXN+80;
const int oo=1000000000;

struct edge
{
	int t,c;
	edge *p;
}e[MAXM],*v[MAXN];

int n,m,N,i,j,k,d[MAXN][12],Q[MAXN+100][2],h,t,s,es=-1,ci;
bool iq[MAXN][12];

inline void addedge(int i,int j,int c)
{
	e[++es].t=j; e[es].c=c; e[es].p=v[i]; v[i]=e+es;
}

int main()
{
	freopen("ping.in","r",stdin);
	freopen("ping.out","w",stdout);
	scanf("%d%d%d",&n,&m,&N);
	while (m--)
	{
		scanf("%d%d%d",&i,&j,&k);
		addedge(i,j,k);
		addedge(j,i,k);
	}
	for (i=0;i<n;i++)
		for (j=0;j<=10;j++)
			d[i][j]=oo;
	d[0][0]=0;
	memset(iq,false,sizeof(iq));
	iq[0][0]=true;
	h=t=s=1;
	Q[1][0]=0;
	Q[1][1]=0;
	while (s)
	{
		k=Q[h][0];
		ci=Q[h][1];
		if (ci<10) 
		for (edge *x=v[k];x;x=x->p)
			if (x->c+d[k][ci]<d[x->t][ci+1])
			{
				d[x->t][ci+1]=x->c+d[k][ci];
				if (!iq[x->t][ci+1])
				{
					iq[x->t][ci+1]=true;
					t=(t+1)%M;
					Q[t][0]=x->t;
					Q[t][1]=ci+1;
					++s;
				}
			}
		iq[k][ci]=false;
		h=(h+1)%M;
		--s;
	}
	int ans=oo;
	for (i=0;i<=10;i++)
		if (d[N][i]<ans) ans=d[N][i];
	if (ans!=oo) printf("%d\n",ans);
	else printf("no\n");
	return 0;
}