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

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

PAT甲級1030

2019-11-11 04:45:55
字體:
來源:轉載
供稿:網友

1030. Travel Plan (30)

時間限制400 ms內存限制65536 kB代碼長度限制16000 B判題程序Standard作者CHEN, Yue

A traveler's map gives the distances between cities along the highways, together with the cost of each highway. Now you are supposed to write a PRogram to help a traveler to decide the shortest path between his/her starting city and the destination. If such a shortest path is not unique, you are supposed to output the one with the minimum cost, which is guaranteed to be unique.

Input Specification:

Each input file contains one test case. Each case starts with a line containing 4 positive integers N, M, S, and D, where N (<=500) is the number of cities (and hence the cities are numbered from 0 to N-1); M is the number of highways; S and D are the starting and the destination cities, respectively. Then M lines follow, each provides the information of a highway, in the format:

City1 City2 Distance Cost

where the numbers are all integers no more than 500, and are separated by a space.

Output Specification:

For each test case, print in one line the cities along the shortest path from the starting point to the destination, followed by the total distance and the total cost of the path. The numbers must be separated by a space and there must be no extra space at the end of output.

Sample Input
4 5 0 30 1 1 201 3 2 300 3 4 100 2 2 202 3 1 20Sample Output
0 2 3 3 40
#include<cstdio>#include<vector>#include<queue>#include<algorithm>using namespace std;const int maxn = 510;const int INF = 1000000000;struct Node{	int v, dis, cost;}node;struct compare{	bool Operator()(Node n1, Node n2)	{		return n1.dis > n2.dis;	}};vector<Node> Adj[maxn];int costs[maxn][maxn];bool vis[maxn] = { false };int d[maxn];//int costs[maxn];vector<int> pre[maxn];int N, M, S, D;void Dijkstra(int s){	fill(d, d + maxn, INF);//	fill(costs, costs + maxn, 0);	d[s] = 0;//	costs[s] = 0;	priority_queue<Node, vector<Node>, compare> Q;	node.v = s; node.dis = d[s]; //node.cost = costs[s];	Q.push(node);	int u;	for (int i = 0; i < N; i++)	{		if (!Q.empty())		{			u = Q.top().v;			vis[u] = true;			Q.pop();		}		else			return;		for (int i = 0; i < Adj[u].size(); i++)		{			int v = Adj[u][i].v;			int dis = Adj[u][i].dis;		//	int cost = Adj[u][i].cost;			if (!vis[v])			{				int t = d[u] + dis;				if (t < d[v])				{					d[v] = t;					pre[v].clear();					pre[v].push_back(u);					node.v = v; node.dis = t; //node.cost = cost;					Q.push(node);				}				else if (t == d[v])				{					pre[v].push_back(u);				}			}		}	}}vector<int> path, tempPath;int minCost = INF;void DFS(int v){	if (v == S)	{		tempPath.push_back(v);		int cost = 0;		int i = tempPath.size();		for (i--; i >0; i--)		{			int id = tempPath[i], idnext = tempPath[i - 1];			cost += costs[id][idnext];		}		if (cost < minCost)		{			minCost = cost;			path = tempPath;		}		tempPath.pop_back();		return;	}	tempPath.push_back(v);	for (int i = 0; i < pre[v].size(); i++)	{		DFS(pre[v][i]);	}	tempPath.pop_back();}void PrintPath(){	for (int i = path.size() - 1; i >= 0; i--)	{		printf("%d ", path[i]);	}}int main(){	scanf("%d%d%d%d", &N, &M, &S, &D);	int City1, City2, Distance, Cost;	for (int i = 0; i < M; i++)//這里輸入的是邊	{		scanf("%d%d%d%d", &City1, &City2, &Distance, &Cost);		node.v = City2; node.dis = Distance; 		costs[City1][City2] = Cost;		costs[City2][City1] = Cost;//node.cost = Cost;		Adj[City1].push_back(node);		node.v = City1;		Adj[City2].push_back(node);	}	Dijkstra(S);	DFS(D);	PrintPath();	printf("%d %d/n", d[D], minCost);	return 0;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 根河市| 错那县| 思茅市| 栖霞市| 三穗县| 呼和浩特市| 利津县| 长葛市| 洪洞县| 东丰县| 枞阳县| 武平县| 丹东市| 微博| 赤峰市| 麻江县| 双牌县| 湘潭市| 金秀| 蒙自县| 乌苏市| 宜良县| 芮城县| 诸城市| 深圳市| 高阳县| 红河县| 肃宁县| 颍上县| 沂南县| 三台县| 商河县| 静宁县| 新化县| 山阴县| 澄江县| 丰台区| 安新县| 尉犁县| 图木舒克市| 福建省|