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: 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. |
- 4 5 0 3
- 0 1 1 20
- 1 3 2 30
- 0 3 4 10
- 0 2 2 20
- 2 3 1 20
0 2 3 3 40
题目大意
求无向图中,某两点间最短距离且权重最小的路径
思路
暴力动规 or 帝洁磕四
- #include
- using namespace std;
- vector<int> road[501],key,result;
- int N,M,st,ed,len[501][501],cost[501][501],lenKey=99999999,costKey;
- void findRoad(int now,int sumLen,int sumCost);
- int main()
- {
- int a,b,c,d;
- cin >> N >> M >> st >> ed;
- while (M--){
- cin >> a >> b >> c >> d;
- road[a].push_back(b);
- road[b].push_back(a);
- len[a][b] = len[b][a] = c;
- cost[a][b] = cost[b][a] = d;
- }
- findRoad(st,0,0);
- for(int x:result) cout << x << " ";
- cout << ed << " " << lenKey << " " << costKey;
- return 0;
- }
- bool apr[501];
- void findRoad(int now,int sumLen,int sumCost)
- {
- if(apr[now] || sumLen>lenKey) return;
- if(now==ed){
- if(sumLen
- lenKey = sumLen;
- costKey = sumCost;
- result.assign(key.begin(),key.end());
- }
-
- return;
- }
- apr[now] = true;
- key.push_back(now);
- for(int x:road[now]) findRoad(x,sumLen+len[now][x],sumCost+cost[now][x]);
- key.pop_back();
- apr[now] = false;
- }
C/C++ (Dijkstra)
- #include
- using namespace std;
- int N,M,road[501][501],cost[501][501],edC,st,ending;
- int ed[501],last[501],edCost[501];
- void Dijkstra(){
- memset(ed,0x3f,sizeof ed);
- memset(edCost,0,sizeof edCost);
- last[st] = -1;
- ed[st] = 0;
- bool apr[501] = {false};
- for(int z=0;z
- int key = -1;
- for(int z1=0;z1
- if(!apr[z1] && (key==-1 || ed[z1]
- }
- apr[key] = true;
- for(int z1=0;z1
- int len = ed[key]+road[key][z1];
- int money = edCost[key] + cost[key][z1];
- if(ed[z1]>len || (ed[z1]==len && edCost[z1]>money)){
- ed[z1] = len;
- last[z1] = key;
- edCost[z1] = money;
- };
- }
- }
- }
- void print(int now){
- if(now!=-1) print(last[now]);
- else return;
- printf("%d ",now);
- if(now==ending) printf("%d %d",ed[now],edCost[now]);
- }
- int main()
- {
- memset(road,0x3f,sizeof road);
- cin >> N >> M >> st >> ending;
- while (M--){
- int a,b,c,d;
- cin >> a >> b >> c >> d;
- road[a][b] = road[b][a] = c;
- cost[a][b] = cost[b][a] = d;
- }
- Dijkstra();
- print(ending);
- return 0;
- }
-
相关阅读:
centos8常见报错处理
Qt语法
设计原则——合成复用原则
电脑e盘文件没删除但不见了怎么办?了解原因与找回方法
查询中一些字段的用法
【开题报告】基于uni-app的汽车租赁app的设计与实现
三、双指针(two-point)
【6 - 完结】Sql Server - 郝斌(identity、视图、事务、索引、存储过程、触发器、游标、TL_SQL)
贪心算法学习——最长单调递增子序列
[最新]访问/加速StackOverFlow的方法
-
原文地址:https://blog.csdn.net/daybreak_alonely/article/details/127720641