比赛 20091026 评测结果 AAATTTTTTT
题目名称 电话网络 最终得分 30
用户昵称 Truth.Cirno 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-10-26 22:22:20
显示代码纯文本
#include <cstdio>
using namespace std;

int n,k,minnum=2000000000,map[1001][1001],dis[1001][1001],way[1001],que[1001],dep[1001],dad[1001],num[1001],num2[1001];
bool able,used[1001],used2[1001];

void swap(int& a,int& b)
{
	int temp;
	temp=a;
	a=b;
	b=temp;
}

void tryit(int pos,int deep)
{
	if (pos==n)
	{
		int i,j;
		for (i=1;i<=deep-1;i++)
			num2[i]=num[i];
		for (i=1;i<=deep-1-1;i++)
			for (j=1;j<=deep-1-i;j++)
				if (num2[j]<num2[j+1])
					swap(num2[j],num2[j+1]);
		if (num2[k+1]<minnum)
			minnum=num2[k+1];
		return;
	}
	used2[pos]=true;
	int i;
	for (i=1;i<=way[pos];i++)
	{
		if (!used2[map[pos][i]])
		{
			num[deep]=dis[pos][map[pos][i]];
			tryit(map[pos][i],deep+1);
		}
	}
	used2[pos]=false;
}

int main(void)
{
	freopen("phone.in","r",stdin);
	freopen("phone.out","w",stdout);
	int i,/*j,*/p,head=1,tail=1/*,maxnum=0*/,temp,temp2,temp3;
	scanf("%d %d %d",&n,&p,&k);
	for (i=1;i<=p;i++)
	{
		scanf("%d %d %d",&temp,&temp2,&temp3);
		map[temp][++way[temp]]=temp2;
		map[temp2][++way[temp2]]=temp;
		dis[temp][temp2]=temp3;
		dis[temp2][temp]=temp3;
	}
	que[1]=1;
	dep[1]=0;
	dad[1]=0;
	used[1]=true;
	while (head>=tail)
	{
		for (i=1;i<=way[que[tail]];i++)
		{
			if (!used[map[que[tail]][i]])
			{
				head++;
				used[map[que[tail]][i]]=true;
				que[head]=map[que[tail]][i];
				dep[head]=dep[tail]+1;
				dad[head]=tail;
				if (que[head]==n)
				{
					able=true;
					break;
				}
			}
		}
		tail++;
	}
	if (!able)
	{
		printf("-1\n");
		fclose(stdin);
		fclose(stdout);
		return(0);
	}
	if (k>=dep[head])
	{
		printf("0\n");
		fclose(stdin);
		fclose(stdout);
		return(0);
	}
//	temp3=0;
//	temp2=head;
//	temp=dad[head];
//	while (temp)
//	{
//		num[++temp3]=dis[temp][temp2];
////		if (dis[temp][temp2]>maxnum)
////			maxnum=dis[temp][temp2];
//		temp2=temp;
//		temp=dad[temp];
//	}
	tryit(1,1);
//	for (i=1;i<=temp3-1;i++)
//		for (j=1;j<=temp3-i;j++)
//			if (num[j]<num[j+1])
//				swap(num[j],num[j+1]);
	printf("%d\n",minnum);
	fclose(stdin);
	fclose(stdout);
	return(0);
}