描述:
已知一个城市的交通路线,经常要求从某一点出发到各地方的最短路径。例如有如下交通图:
则从A出发到各点的最短路径分别为:
B:0
C:10
D:50
E:30
F:60
输入:
输入只有一个用例,第一行包括若干个字符,分别表示各顶点的名称,接下来是一个非负的整数方阵,方阵维数等于顶点数,其中0表示没有路,正整数表示两点之间边的长度。可以假定该图为有向图。
最后一行为要求的出发点。
输出:
输出从已知起点到各顶点的最短路径长度。输出格式是根据顶点输入顺序,依次输出其最智短路径长度。各顶点分别用一行输出,先输出目标顶点,然后一冒号加一个空格,最后是路径长度。0表示没有路。
样例输入:
ABCDEF
0 0 10 0 30 100
0 0 5 0 0 0
0 0 0 50 0 0
0 0 0 0 0 10
0 0 0 20 0 60
0 0 0 0 0 0
A
样例输出:
B: 0
C: 10
D: 50
E: 30
F: 60
解释见注释
ac代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
string ss;
int g[N][N],d[N],st[N],m,qd;
map<char,int> mp;
//朴素版dijsktra
void dijsktra()
{
//一共还有m-1的最短路没确定,每次确定一个,循环m-1次
for(int i=0;i<m-1;i++)
{
int t=-1;
//每次选出到起点距离最短的点,并更新其子节
for(int j=0;j<m;j++)
if((t==-1||d[j]<d[t])&&!st[j])
t=j;
st[t]=1;
for(int j=0;j<m;j++)
if(d[j]>d[t]+g[t][j])
d[j]=d[t]+g[t][j];
}
}
int main()
{
cin>>ss;
m=ss.size();
//记录每个字母对应的数字
for(int i=0;i<m;i++) mp[ss[i]]=i;
//输入邻接矩阵
for(int i=0;i<m;i++)
for(int j=0;j<m;j++)
{
cin>>g[i][j];
if(!g[i][j])g[i][j]=0x3f3f3f3f;
}
char sta;
cin>>sta;
memset(d,0x3f,sizeof d);
d[mp[sta]]=0;
dijsktra();
for(int i=0;i<m;i++)
{
if(ss[i]==sta) continue;
if(d[mp[ss[i]]]==0x3f3f3f3f) d[mp[ss[i]]]=0;
cout<<ss[i]<<": "<<d[mp[ss[i]]]<<endl;
}
}