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