最短路径

题目描述
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
输入
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=10000),表示在路口A与路口B之间有一条路A->B,我们的工作人员需要C分钟的时间走过这条路。
如果不存在n前往1的路径则输出-1
输出
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
样例输入 Copy
2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
样例输出 Copy
3
10

  • 这个是比较简单的多源最短路径,但时间效率低,原理就是把k作为中转点,不断找最短路径
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int const MAXN = 10005;
int ans[105][105];
int n, m;
int main() {
    ios::sync_with_stdio(false);
    while(cin >> n >> m){
    	for(int i = 1; i <= n; i ++){
    		for(int j = 1; j <= n; j ++)
    			ans[i][j] = i == j ? 0 : MAXN;
		}
		int a, b, c;
		for(int i = 1; i <= m; i ++){
			cin >> a >> b >> c;
			if(ans[a][b] > c)
				ans[a][b] = c;
		}
		for(int k = 1; k <= n; k ++){
			for(int i = 1; i <= n; i ++)
				for(int j = 1; j <= n; j ++)
					ans[i][j] = min(ans[i][j], ans[i][k] + ans[k][j]);
		}
		if(ans[1][n] == MAXN)cout << -1 << endl;
		else cout << ans[1][n] << endl;
	}
	return 0;
}

  • Dijkstra是最快的单源最短路,从一个起点出发,不断遍历,每次找离起点最近且没被当作中转点的点进行中转
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int const MAXN = 10005;
int ans[105];
int vis[105];
int s[105][105];
int n, m;
void Dijkstra(int x){
	vis[x] = 1;
	for(int i = 1; i <= n; i ++){
		ans[i] = s[x][i];
	}
	while(1){
		int Min = MAXN, flag = -1;
		for(int i = 1; i <= n; i ++){
			if(ans[i] < Min && vis[i] == 0){
				Min = ans[i];
				flag = i;
			}
		}
		if(flag == -1)break;
		vis[flag] = 1;
		for(int i = 1; i <= n; i ++){
			if(vis[i] == 1)continue;
			if(ans[i] > ans[flag] + s[flag][i])
				ans[i] = ans[flag] + s[flag][i];
		}
	}
}
int main() {
    ios::sync_with_stdio(false);
    while(cin >> n >> m){
    	memset(vis,0,sizeof(vis));
    	for(int i = 1; i <= n; i ++){
    		for(int j = 1; j <= n; j ++)
    			s[i][j] = i == j ? 0 : MAXN;
		}
		int a, b, c;
		for(int i = 1; i <= m; i ++){
			cin >> a >> b >> c;
			if(s[a][b] > c){
				s[a][b] = c;
			}
		}
		Dijkstra(1);
		if(ans[n] == MAXN) cout << -1 << endl;
		else cout << ans[n] << endl;
	}
	return 0;
}

你可能感兴趣的:(最短路径)