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