国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

1030. Travel Plan 解析

2019-11-11 01:19:36
字體:
來源:轉載
供稿:網友

直接Dijstra感覺簡單點,這個第二標尺比較容易想明白。Dijstra+DFS感覺反而麻煩了一點 兩個都寫了下練練手。

#include <iostream>#include <string>#include <vector>#include <algorithm>#include <climits>#include <stack>#define MAX 510using namespace std;struct Node {	int v;	int dis;	int cost;};vector <Node> g[MAX];vector <bool> isVis;vector <int> PRe[MAX];vector <int> dis;vector <int> cost;int P[MAX];int C[MAX];int N, M, S, D;void dijstra(int st) { //st 起點		dis[st] = 0;	C[st] = 0;	for (int i = 0; i < N; i++) {				int min = INT_MAX, u = -1;		for (int j = 0;j < N; j++) { //找最小距離			if (!isVis[j] && min > dis[j]) {				min = dis[j];				u = j;			}		}		if (u == -1) return;//沒有最小值		isVis[u] = true;		for (int j = 0; j < g[u].size(); j++) {			int v = g[u][j].v;			if (!isVis[v]) {				if (dis[v] > dis[u] + g[u][j].dis) {					dis[v] = dis[u] + g[u][j].dis;					pre[v].clear();					pre[v].push_back(u);					//法二					P[v] = u;					C[v] = C[u] + g[u][j].cost;				}				else if (dis[v] == dis[u] + g[u][j].dis) {					pre[v].push_back(u);					//法二					if (C[v] > C[u] + g[u][j].cost) {						P[v] = u;						C[v] = C[u] + g[u][j].cost;					}				}			}		}	}}vector <int> patch, ThisPath;int MinCost = INT_MAX;void DFS(int v) {	if (v == S) { //到達起點		ThisPath.push_back(v);		int ThisCost = 0;		int ID = 0;		int IDN = 0;		for (int i = ThisPath.size() - 1; i > 0; i--) {			ID = ThisPath[i];			IDN = ThisPath[i - 1];			for (int j = 0; j < g[ID].size(); j++) {				if (g[ID][j].v == IDN)					IDN = j;			}			ThisCost += g[ID][IDN].cost;		}		if (ThisCost < MinCost) {			MinCost = ThisCost;			patch = ThisPath;		}		ThisPath.pop_back();		return;	}	ThisPath.push_back(v);	for (int i = 0; i < pre[v].size(); i++) {		DFS(pre[v][i]);	}	ThisPath.pop_back();	}int main() {	cin >> N >> M >> S >> D;	isVis.resize(N, false);	dis.resize(N,INT_MAX);	cost.resize(N, INT_MAX);		for (int i = 0; i < N; i++) {		C[i] = INT_MAX;		P[i] = -1;	}	int Head, Tail;	Node temp;	for (int i = 0; i < M; i++) {		cin >> Head >> Tail >> temp.dis >> temp.cost;		temp.v = Tail;		g[Head].push_back(temp);		temp.v = Head;		g[Tail].push_back(temp);	}#ifdef _DEBUG	for (int i = 0; i < N; i++) {			for (int j = 0; j < g[i].size(); j++) {		 	cout <<i << " " <<  g[i][j].v << " dis:" << g[i][j].dis << " cost:" << g[i][j].cost << endl;		}	}#endif	//法一	dijstra(S);	DFS(D);	for (int i = patch.size() - 1; i >= 0; i--) {		cout << patch[i] << " ";	}	cout << dis[D] << " " << MinCost << endl;#ifdef _DEBUG	for (int i = 0; i < N; i++) {		cout << "-------" << i << "--------" << endl;		for (int j = 0; j < pre[i].size(); j++) {			cout << pre[i][j] << endl;		}	}#endif			//法二	//stack <int> s;	//int p = D;	//while (p != -1) {	//	s.push(p);	//	p = P[p];	//}	//while (!s.empty()) {	//	cout << s.top() << " ";	//	s.pop();	//}	//cout << dis[D] << " " << C[D] << endl;	system("pause");	return 0;}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新民市| 垦利县| 黄龙县| 开封市| 漳平市| 华容县| 当阳市| 内江市| 罗定市| 方山县| 成都市| 海门市| 凤庆县| 定州市| 巴马| 林口县| 青岛市| 新宾| 沙河市| 香格里拉县| 南城县| 福建省| 东城区| 贺兰县| 东源县| 平定县| 广水市| 镇江市| 新平| 安龙县| 自治县| 高平市| 和田市| 青河县| 通辽市| 上栗县| 石泉县| 汤原县| 尉氏县| 荥经县| 兰西县|