DS图应用–最短路径(含代码框架)
题目描述
给出一个图的邻接矩阵,再给出指定顶点v0,求顶点v0到其他顶点的最短路径
代码框架如下:
输入
第一行输入t,表示有t个测试实例
第二行输入n,表示第1个图有n个结点
第三行起,每行输入邻接矩阵的一行,以此类推输入n行
第i个结点与其他结点如果相连则为1,无连接则为0,数据之间用空格隔开
第四行输入v0,表示求v0到其他顶点的最短路径距离
以此类推输入下一个示例
输出
每行输出v0到某个顶点的最短距离和最短路径
每行格式:v0编号-其他顶点编号----[最短路径],具体请参考示范数据
样例查看模式
正常显示
查看格式
输入样例1 <-复制
1
5
0 5 0 7 15
0 0 5 0 0
0 0 0 0 1
0 0 2 0 0
0 0 0 0 0
0
输出样例1
0-1-5----[0 1 ]
0-2-9----[0 3 2 ]
0-3-7----[0 3 ]
0-4-10----[0 3 2 4 ]
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int n;int arr[100][100]={0};int dd;
int main(){
int t;cin>>t;
while (t--){
cin>>n;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cin>>arr[i][j];
}
}cin>>dd;
int v[100]={0};int dis[100];vector<queue<int>>vq(n);
for (int i = 0; i < n; ++i) {
dis[i]=99;
}
v[dd]=1;dis[dd]=0;vq[dd].push(dd);
int tt=100;
while (tt--){
for (int hang = 0; hang < n; ++hang) {if(v[hang]==0)continue;
for (int shu = 0; shu < n; ++shu) {
if(arr[hang][shu]==0)continue;
if(dis[hang]+arr[hang][shu]<dis[shu]){
dis[shu]=dis[hang]+arr[hang][shu];
vq[shu]=vq[hang];vq[shu].push(shu);
}
}int mindis=99;
for (int k = 0; k < n; ++k) {
if(mindis>dis[k]&&v[k]!=1)mindis=k;
}v[mindis]=1;
}
}
for (int k = 0; k < n; ++k) {if(k==dd)continue;
cout<<dd<<"-"<<k<<"-"<<dis[k]<<"----[";
while (!vq[k].empty()){
cout<<vq[k].front()<<" ";vq[k].pop();
}cout<<"]"<<endl;
}
}
}
- 理解成和dfs差不多一直WA。。。