国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 关岭| 司法| 大兴区| 石家庄市| 武平县| 五峰| 荔波县| 平江县| 朝阳市| 资兴市| 小金县| 梁河县| 县级市| 明光市| 四平市| 吴忠市| 剑阁县| 清流县| 阿勒泰市| 重庆市| 英吉沙县| 祥云县| 八宿县| 库尔勒市| 突泉县| 长垣县| 临澧县| 九江市| 哈密市| 库尔勒市| 师宗县| 汕头市| 广灵县| 麦盖提县| 沙田区| 延津县| 吉林市| 吉林市| 宁河县| 达州市| 东乡县|