刷题笔记-图-统计图中多条最短路径

思路

  1. dijkstra统计最短路径,vector pre[n],记录顶点在最短路径上的前一个顶点(可能有多个),如pre[2]表示起点到顶点2所有最短路径中顶点2的前一个顶点
    如图:pre[3]有两个元素1,4
  2. dfs遍历所有路径

Code

#include <iostream>
#include <vector>
#include <stack>
using namespace std;
const int INF=9999999;
const int maxn=510;
int n,cm,sp,vw[maxn],gw[maxn][maxn],dist[maxn],path[maxn],col[maxn];
vector<int> pre[maxn],temp,minp; //统计所有最短路径-逆序
int dmin() {
	int min=INF,mini=-1;
	for(int i=0; i<=n; i++) {
		if(col[i]==0 && min>dist[i]) {
			min=dist[i];
			mini=i;
		}
	}
	return mini;
}
void dijkstra(int c) {
	// 初始化
	fill(dist,dist+n+1,INF);
	fill(path,path+n+1,-1);
	dist[0]=0;
	// 取最小值
	for(int j=0; j<=n; j++) {
		int min=dmin();
		col[min]=1;
		if(min==sp)break; //已找到终点 最短路径
		for(int i=0; i<=n; i++) {
			if(gw[min][i]==0||col[i]==1)continue;
			if(dist[min]+gw[min][i]<dist[i]) {
				dist[i]=dist[min]+gw[min][i];
				path[i]=min;
				pre[i].clear();
				pre[i].push_back(min);
			} else if(dist[min]+gw[min][i]==dist[i]) {
				pre[i].push_back(min);
			}
		}
	}
}
void dfs(int e) {
	if(e==0) {
		temp.push_back(e);
		//对每条短路径的处理 
		for(int i=temp.size()-1;i>=0;i--){
			//遍历每条最短路径 
		}
		temp.pop_back(); 
		return;
	}
	temp.push_back(e);
	for(int i=0; i<pre[e].size(); i++) {
		dfs(pre[e][i]);
	}
	temp.pop_back();
}
int main(int argc,char * argv[]) {
	int m,a,b;
	scanf("%d %d",&n,&m);
	for(int i=0; i<m; i++) {
		scanf("%d %d",&a,&b);
		scanf("%d",&gw[a][b]);
		gw[b][a]=gw[a][b];
	}
	dijkstra(0);
	dfs(sp);

	return 0;
}

posted @ 2020-02-29 19:59  JamieHou  阅读(405)  评论(0)    收藏  举报