题目
问题 D: 第K短路径的顶点(DS图)
时间限制: 1 Sec 内存限制: 128 MB
提交: 3 解决: 0
[提交][状态][讨论版]
题目描述
给出一个图的邻接矩阵,输入源顶点编号i,用Dijkstra算法求i到其它顶点的最短路径,保存距离i第K短路径的所有顶点编号,并按顶点编号由小到大输出。K从1开始。
输入
第1行输入t,表示有t个测试实例
第2行输入顶点数n
第3行起,每行输入邻接矩阵的一行,以此类推输入n行,其中的数据为:
第i个结点与其它结点如果相连则为距离,无连接则为0,数据之间用单个空格隔开。
第3+n行输入源点编号i(从0开始)和K值(从1开始),两者之间用单个空格隔开
以此类推输入下一个测试实例
输出
对每组测试数据,输出:
距离i第K短路径的所有顶点,按顶点编号由小到大输出,数据之间用单个空格隔开。无需考虑结果为空的情况。
样例输入
2
5
0 5 0 7 7
0 0 5 0 0
0 0 0 0 1
0 0 2 0 0
0 0 0 0 0
0 2
7
0 1 2 0 0 0 0
0 0 1 3 0 0 2
0 0 0 0 0 1 0
0 0 0 0 2 0 0
0 0 0 0 0 0 0
0 0 0 0 1 0 0
0 0 0 0 3 0 0
0 3
样例输出
3 4
代码块
#include <iostream>
#include <stack>
using namespace std;
class Graph
{
int vexnum;
int **matrix;
int *S;
int *dist;
int IsOver();
public:
Graph();
~Graph();
void Dijkstra(int vex, int num);
};
Graph::Graph()
{
int i, j;
cin>>vexnum;
matrix = new int*[vexnum];
S = new int[vexnum];
dist = new int[vexnum];
for(i=0; i<vexnum; i++)
{
matrix[i] = new int[vexnum];
S[i] = 0;
dist[i] = 99999;
}
for(i=0; i<vexnum; i++)
for(j=0; j<vexnum; j++)
cin>>matrix[i][j];
}
Graph::~Graph()
{
for(int i=0; i<vexnum; i++)
delete []matrix[i];
delete []matrix;
delete []S;
delete []dist;
}
int Graph::IsOver()
{
for(int i=0; i<vexnum; i++)
if(S[i]==0 && dist[i]!=99999)
return 0;
return 1;
}
void Graph::Dijkstra(int vex, int num)
{
int i, minweight, pos;
int v = vex;
S[v] = 1;
dist[v] = 0;
for(i=0; i<vexnum; i++)
{
if(matrix[v][i])
dist[i] = matrix[v][i];
}
while(!IsOver())
{
minweight = 99999;
for(i=0; i<vexnum; i++)
{
if(!S[i] && dist[i]<minweight)
{
minweight = dist[i];
pos = i;
}
}
S[pos] = 1;
for(i=0; i<vexnum; i++)
{
if(matrix[pos][i] && !S[i] && (dist[pos]+matrix[pos][i])<dist[i])
dist[i] = dist[pos]+matrix[pos][i];
}
}
int temp;
int s[vexnum];
int n = 1;
while(num--)
{
int min = 999999;
for(i=0; i<vexnum; i++)
{
if(dist[i]<min && i!=vex)
{
min = dist[i];
temp = i;
}
}
dist[temp] = 999999;
if(!num)
{
s[0] = temp;
for(i=0; i<vexnum; i++)
if(dist[i]==min)
{
s[n] = i;
n++;
}
for(i=0; i<n; i++)
{
if(i!=n-1)
cout<<s[i]<<' ';
else
cout<<s[i]<<endl;
}
}
}
}
int main(void)
{
int t;
cin>>t;
while(t--)
{
Graph myGraph;
int num;
int vex;
cin>>vex>>num;
myGraph.Dijkstra(vex, num);
}
return 0;
}