比赛 |
20120703 |
评测结果 |
AAAAAAAAWW |
题目名称 |
旅行 |
最终得分 |
80 |
用户昵称 |
Czb。 |
运行时间 |
0.146 s |
代码语言 |
C++ |
内存使用 |
3.36 MiB |
提交时间 |
2012-07-03 11:40:03 |
显示代码纯文本
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
struct orz
{
int a,b;
};
int n,m,K;
int s[101],u[101][101],v[101][101];
queue <orz> q;
int main()
{
freopen("travela.in","r",stdin);
freopen("travela.out","w",stdout);
int i,j,k,x,y,z;
for(scanf("%d%d%d",&n,&m,&K);n|m|K;scanf("%d%d%d",&n,&m,&K))
{
memset(v,0,sizeof(v));
memset(u,60,sizeof(u));
memset(s,60,sizeof(s));
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
x++;y++;
u[x][y]=1;
if(v[x][y]==0||v[x][y]>z)
v[x][y]=z;
}
for(i=1;i<=n;i++)
u[i][i]=0;
for(k=1;k<=n;k++)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(u[i][k]+u[k][j]<u[i][j])
u[i][j]=u[i][k]+u[k][j];
}
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if((u[i][j]>1000000000)||(u[j][i]>1000000000))
v[i][j]<<=1;
}
}
s[1]=0;
orz tmp;
tmp.a=1;tmp.b=0;
q.push(tmp);
while(!q.empty())
{
tmp=q.front();
for(i=1;i<=n;i++)
{
if(v[tmp.a][i]&&v[tmp.a][i]+s[tmp.a]<s[i])
{
if(u[tmp.a][i]>1000000000||u[i][tmp.a]>1000000000)
{
if(tmp.b+1<=K)
{
s[i]=v[tmp.a][i]+s[tmp.a];
orz tmp1;
tmp1.a=i;
tmp1.b=tmp.b+1;
q.push(tmp1);
}
}
else
{
s[i]=v[tmp.a][i]+s[tmp.a];
orz tmp1;
tmp1.a=i;
tmp1.b=tmp.b;
q.push(tmp1);
}
}
}
q.pop();
}
if(s[n]>1000000000)
printf("-1\n");
else
printf("%d\n",s[n]);
}
return 0;
}