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

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

1030. Travel Plan 解析

2019-11-10 22:30:10
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

直接Dijstra感覺(jué)簡(jiǎn)單點(diǎn),這個(gè)第二標(biāo)尺比較容易想明白。Dijstra+DFS感覺(jué)反而麻煩了一點(diǎn) 兩個(gè)都寫(xiě)了下練練手。

#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 起點(diǎn)		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;//沒(méi)有最小值		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) { //到達(dá)起點(diǎn)		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;}


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 佛教| 武清区| 兴业县| 新闻| 韩城市| 井研县| 彩票| 策勒县| 娱乐| 辛集市| 海安县| 尖扎县| 扬州市| 平舆县| 丹阳市| 东丰县| 漾濞| 南阳市| 开鲁县| 邵阳县| 德令哈市| 桃园县| 宁国市| 茂名市| 库伦旗| 满洲里市| 宜都市| 郁南县| 沐川县| 老河口市| 平乐县| 瓦房店市| 滦平县| 江阴市| 深州市| 台安县| 防城港市| 邵东县| 万全县| 探索| 那曲县|