hdu 2680 Choose the best route
TLE 一次,自己是把各个起点开始都算一次取最小的,结果超时。。。
后来看了一下结题报告,原来可以当做从0开始,,NB的大神。。
#include"stdio.h"
#include"string.h"
#define INF 999999
int map[1001][1001],mark[1001],f[1001];
int n,m,t,e;
int min(int x,int y)
{
return x<y?x:y;
}
int dijkstra(int s)
{
int i,j,k,m;
memset(mark,0,sizeof(mark));
for(i=1;i<=n;i++)
f[i]=map[s][i];
f[s]=0;mark[s]=1;
for(i=1;i<=n;i++)
{
m=INF;
for(j=1;j<=n;j++)
if(!mark[j]&&f[j]<m)
{
m=f[j];k=j;
}
if(m==INF)break;
mark[k]=1;
for(j=1;j<=n;j++)
if(!mark[j]&&f[j]>f[k]+map[k][j])
f[j]=f[k]+map[k][j];
}
if(f[e]<INF)return f[e];
else return -1;
}
int main()
{
int s,i,j,a,b,c,ans,mm;
while(scanf("%d%d%d",&n,&m,&e)!=EOF)
{
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
map[i][j]=(i==j?0:INF);
for(i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
map[a][b]=min(map[a][b],c);
}
scanf("%d",&t);
mm=INF;
while(t--)
{
scanf("%d",&s);
map[0][s]=0;
}
ans=dijkstra(0);
if(ans==-1)
printf("-1\n");
else printf("%d\n",ans);
}
return 0;
}
浙公网安备 33010602011771号