输入样例:
4 4 1
1 2 2
1 4 8
3 2 16
3 4 10
1
输出样例:
1->1:0
1->2:2
1->3:no path
1->4:8
思路:
标题即思路,只需要熟记Dijkstra算法就可以把这道题做出来,关于Dijkstra算法网上的教程有很多,大家可以去学习一下。Dijkstra也算是PAT的一大考点,学会了Dijkstra最短路径就不怕了。
本题目的节点数比较少,用Floyd算法应该是可以通过的,但其实在实战中,Floyd一般都会超时,所以希望可以学习一下Dijkstra算法。
什么时候能独自写出Dijkstra算法,那么就算是学会了,所以千万不要觉得难,模板题都是万变不离其宗的。
参考代码:
#include<bits/stdc++.h>
using namespace std;
int n, m, type;
const int MAXSIZE = 11;
const int INVALID = 2147483647;
int connect[MAXSIZE][MAXSIZE];
// 模板,只要能独立写一遍,差不多就会了,千万不要觉得难
void dijkstra(int start) {
int consumes[MAXSIZE];
bool searched[MAXSIZE];
for(int i=1;i<=n;++i) {
searched[i] = false;
consumes[i] = connect[start][i];
}
searched[start] = true;
consumes[start] = 0;
while(true) {
int minConsume = INVALID, minPoint = -1;
for(int i=1;i<=n;++i) {
if(!searched[i] && consumes[i] < minConsume) {
minConsume = consumes[i];
minPoint = i;
}
}
if(minPoint == -1) break;
searched[minPoint] = true;
for(int i=1;i<=n;++i) {
if(!searched[i] && connect[minPoint][i] != INVALID && connect[minPoint][i] + consumes[minPoint] < consumes[i]) {
consumes[i] = connect[minPoint][i] + consumes[minPoint];
}
}
}
for(int i=1;i<=n;++i) {
cout<<start<<"->"<<i<<":";
if(consumes[i] != INVALID) {
cout<<consumes[i]<<endl;
} else {
cout<<"no path"<<endl;
}
}
}
void init() {
for(int i=0;i<MAXSIZE;++i) {
for(int j=0;j<MAXSIZE;++j) {
connect[i][j] = INVALID;
}
}
}
int main() {
cin>>n>>m>>type;
init();
while(m--) {
int from, to, distance;
cin>>from>>to>>distance;
connect[from][to] = distance;
if(type == 0) {
connect[to][from] = distance;
}
}
int start; cin>>start;
dijkstra(start);
return 0;
}