#include "iostream"
#include "string"
#include "cstring"
#include "map"
using namespace std;
int dis[300][300];
int stdis[300];
int vis[300];
int n;
int _min;
int dijkstra(int s,int t){
memset(vis, 0, sizeof(vis));
for (int i=0; i<n; ++i) {
if(i==s){
stdis[i]=0;
}else{
stdis[i]=1000001;//初始化注意
}
}
int tt;
for (int i = 0; i < n; ++i)
{
_min=100000;tt=s//初始为起点
for (int j = 0; j < n; ++j)
{
if(!vis[j] && _min > stdis[j]){
_min=stdis[j];
tt=j;
}
}
vis[tt]=1;
for (int j=0;j<n; ++j) {
stdis[j]=min(dis[tt][j]+stdis[tt],stdis[j]);
}
}
if(vis[t]){
return stdis[t];
}else{
return -1;
}
}
int main(){
int c,r,d;
string s,t;
cin>>c;
while(c--){
cin>>r;
memset(dis, 0, sizeof(dis));
memset(stdis, 0, sizeof(stdis));
for(int i = 0;i < 205;++i)
for(int j = 0;j < 205;++j)
{if(i==j)dis[i][j] = 0;
else dis[i][j]=100000;
}//初始化需要注意⚠
map<string,int> mp;
n=0;
for (int i = 0; i < r; ++i)
{
cin>>s>>t>>d;
if(!mp.count(s)){
mp[s]=n++;
// cout<<mp[s]<<endl;
}if(!mp.count(t)){
mp[t]=n++;
// cout<<mp[t]<<endl;
}
dis[mp[s]][mp[t]]=d;
dis[mp[t]][mp[s]]=d;
}
cin>>s>>t;
if(s==t){
cout<<0<<endl;
}else{
cout<<dijkstra(mp[s],mp[t])<<endl;
}
}
}
sicily1031-Campus(单源最短路径dijkstra)
最新推荐文章于 2017-11-06 16:22:51 发布