比赛 |
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);
}