您的位置:首页 > 其它

hdu 2680 Choose the best route (dijkstra)

2015-08-10 19:15 447 查看
/*
求点与点之间最短距离。因为此题的起始点不定,
所以可用反向图来求得,终点确定,从终点出发
*/
# include <stdio.h>
# include <algorithm>
# include <string.h>
using namespace std;
# define INF 10000010
int map[2010][2010];
int dis[2010];
int vis[2010];
int n;
void dijkstra(int s)
{
int i,j;
int k=0;
memset(vis,0,sizeof(vis));
for(i=1; i<=n; i++)
dis[i]=map[s][i];
vis[s]=1;
dis[s]=0;
for(i=1; i<n; i++) //剩下的点
{
int minn=INF;
for(j=1; j<=n; j++)
{
if(!vis[j]&&dis[j]<minn)
{
minn=dis[j];
k=j;
}
}
if(minn==INF)
break;
vis[k]=1;//最小的顶点
for(j=1; j<=n; j++)
{
if(!vis[j]&&dis[j]>dis[k]+map[k][j])
{
dis[j]=dis[k]+map[k][j];
}
}
}
return ;
}
int main()
{
int m,s,a,b,c,w,i,j;
while(~scanf("%d%d%d",&n,&m,&s))
{
//  memset(map,INF,sizeof(map));
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
map[i][j]=INF;
}
for(i=0; i<m; i++)
{
scanf("%d%d%d",&a,&b,&c);///倒过来以s为起点出发
if(map[b][a]>c)
map[b][a]=c;
}
memset(dis,0,sizeof(dis));
dijkstra(s);
scanf("%d",&w);
int minn=INF;
while(w--)
{
scanf("%d",&a);
minn=min(minn,dis[a]);
}
if(minn==INF)
printf("-1\n");
else
printf("%d\n",minn);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: