将地图简化为一张无向网,
史东薇尔城是一号结点,每一次执行任务:当前的所在地——>史东薇尔城——>任务地点。
每次会告诉你:当前所在结点,任务地所在结点,求出每次任务最短需要跑多远。
典型的在v0=1号结点跑单源最短路径,答案是俩个D[]的和
普通大学生数据结构代码如下
#include<bits/stdc++.h>
using namespace std;
#define V 20 //最多20个节点
#define MAXINT 1000 //路径最大1000
int S[V];
int D[V];
int Path[V];
int w;
typedef struct {
int vexs[V];//储存点
int arcs[V][V];//储存邻接矩阵
int vexnum,arcnum;
}Graph;
void Create(Graph *G)
{
cin>>G->vexnum>>G->arcnum;//图的结点数和边数
//for( int i=0;i<G->vexnum;++i) cin>>G->vexs[i]; //依次输入点的信息
for( int i=0;i<G->vexnum;++i)
{
for( int j=0;j<G->vexnum;++j)
{
G->arcs[i][j] = MAXINT; //初始化邻接矩阵,边的权值 均置为极大值MAXINT
}
}
for( int i=0;i<G->arcnum;++i)
{
int v1,v2,w; cin>>v1>>v2>>w;
G->arcs[v1-1][v2-1]= w;
G->arcs[v2-1][v1-1]= w;//无向网 边<v1,v2>,<v2,v1>的权值是w
}
}
//用Dijkstra算法求有向网G的v0顶点到其余顶点的最短路径
void dij(Graph G,int v0)
{
//--------------初始化
int n,v,i;
n=G.vexnum; //n为G中顶点的个数
for( v=0;v<n;++v ) //对n个顶点依次初始化
{
S[v]=0; //vi不在S集合
D[v]=G.arcs[v0][v]; //将v0到vi的最短路径长度 初始化为弧上的权值
if( D[v]<MAXINT ) Path[v]=v0; //如果v0和vi之间有弧,则将v的前驱置为v0
else Path[v]= -1; 如果v0和vi之间没有弧,则将v的前驱置为-1
}
S[v0] = 1;//将v0加入S集
D[v0] = 0;//源点到源点的距离是0
//-------------主循环
//1.每次从未标记的节点中选择出 的节D[]最小的点 ,标记,收录到S集
//2.查询刚加入节点A的临近节点B的距离D[B] ,
//若(D[A]+G.arcs[A][B])<节点B的距离,就更新节点B的距离和前面点是A
for( int i=0;i<n;++i )
{
int min;
min=MAXINT;
for (w=0;w<n;++w)
if( !S[w] && D[w]<min )
{
v=w;
min=D[w];
}
S[v]=1;
for( w=0;w<n;++w )
if( !S[w] && (D[v]+G.arcs[v][w]<D[w]) )
{
D[w]=D[v]+G.arcs[v][w];
Path[w]=v;
}
}
}
int main()
{
Graph G;//定义结构体变量G
Create(&G);//创建网G
dij(G,0);//用迪杰斯特拉算法求最短路径
//for (int i=1;i<G.vexnum;++i)
// cout<<G.vexs[0]<<G.vexs[i]<<D[i];//输出源点0到各点的最短路径
int t;cin>>t;
int h,k;
while( t-- ) {
cin>>h>>k;
cout<<D[h-1]+D[k-1]<<"\n";
}
return 0;
}