http://acm.hdu.edu.cn/showproblem.php?pid=2680
这个题目其实是属于简单的最短路问题 但要注意一点 否则会超时哦
Dijkstra 算法 这个算法重点是 假设有二个顶点集合A B 先假设所有的顶点全部都是属于 A 吧 拿出一个顶点出来 假设是V1 然后计算剩下的每个顶点到 V1 的距离 然后找出一个最短的距离 假设 Vi 到V1的距离最短 然后把Vi放进 B集合中 更新剩下 每个点到 VI 的距离 重复上面的操作 呵呵
#include<iostream>
#include<cstring>
using namespace std;
int a[1002][1002];
bool visit[1002];
int dis[1002];
int n,m,s;
#define max 9999999
void Dijkstra(int ss) ///s代表终点 ss代表起点
{
memset(visit,false,sizeof(visit));
int i=0,k;
for(i=0;i<n;i++)
dis[i]=a[ss][i];
dis[ss]=0;
for(i=0;i<n;i++)
{
int min=max;
for(int j=0;j<n;j++)
{
if(!visit[j]&&dis[j]<min)
{
min=dis[j];
k=j;
}
}
if(min==max) break;
visit[k]=true;
for(int j=0;j<n;j++)
{
if(!visit[j])
if(dis[k]+a[k][j]<dis[j])
{
dis[j]=dis[k]+a[k][j];
}
}
}
}
int main()
{
int p,q,t,i,j,w,h;
while(cin>>n>>m>>s)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
a[i][j]=max;
while(m--)
{
cin>>p>>q>>t;
p=p-1;
q=q-1;
if(a[q][p]>t)
a[q][p]=t; ///这里要注意一下 是有向图 我刚开始就这里错了 找了好久
}
Dijkstra(s-1); ///终点不一定是终点 起点也不一定是起点
cin>>w;
int min=max;
for(i=0;i<w;i++)
{
cin>>h;
/// cout<<"dis[h-1] "<<dis[h-1]<<endl;
if(dis[h-1]<min) min=dis[h-1];
}
if(min!=max) cout<<min<<endl;
else cout<<"-1"<<endl;
}
return 0;
}