这道题应该是30分里最简单的题目之一了,很寻常的最短路径,相信经过PAT前面多道类似题目的联系,这题的思路和要定义的数据结构也是一目了然。因为有了多条最短路径时的选择,所以还是不用单源最短路径,用深度优先搜索即可。
没有坑,只要思路对了、DFS的代码写正确了,示例测点过了,三个用例就都能对。
虽然和前面些许题有重合,但是多练几遍之后现在就能很快的独立完成DFS的编码了,以前还需要对照算法书上的例子看,现在不用了。DFS可能是PAT甲级里最重要的解题方法,掌握的牢固一些还是很有好处的~
#include<stdio.h>
#include<vector>
using namespace std;
struct E
{
int des;
int dis;
int cost;
};
vector<E> edges[500];
vector<int> bestRoute;
int bestDis;
int bestCost;
bool mark[500];
void DFS(int sta, int des, int dis, int cost, vector<int> route)
{
for (int i = 0; i < edges[sta].size(); i++)
{
if (mark[edges[sta][i].des] == true)
{
continue;
}
else
{
mark[edges[sta][i].des] = true;
dis += edges[sta][i].dis;
if (dis > bestDis)
{
mark[edges[sta][i].des] = false;
dis -= edges[sta][i].dis;
continue;
}
cost += edges[sta][i].cost;
route.push_back(edges[sta][i].des);
if (edges[sta][i].des == des)
{
if (dis < bestDis)
{
bestDis = dis;
bestCost = cost;
bestRoute.clear();
bestRoute.assign(route.begin(), route.end());
}
else if (dis == bestDis)
{
if (cost < bestCost)
{
bestDis = dis;
bestCost = cost;
bestRoute.clear();
bestRoute.assign(route.begin(), route.end());
}
}
}
else
{
DFS(edges[sta][i].des, des, dis, cost, route);
}
mark[edges[sta][i].des] = false;
dis -= edges[sta][i].dis;
cost -= edges[sta][i].cost;
route.pop_back();
}
}
}
int main()
{
int N, M, S, D;
scanf("%d%d%d%d", &N, &M, &S, &D);
for (int i = 0; i < M; i++)
{
int sta, des, dis, cost;
scanf("%d%d%d%d", &sta, &des, &dis, &cost);
E e;
e.des = des;
e.dis = dis;
e.cost = cost;
edges[sta].push_back(e);
e.des = sta;
edges[des].push_back(e);
}
for (int i = 0; i < N; i++)
{
mark[i] = false;
}
bestDis = 10000000;
bestCost = 100000000;
mark[S] = true;
vector<int> route;
route.push_back(S);
DFS(S, D, 0, 0, route);
for (int i = 0; i < bestRoute.size(); i++)
{
if (i == 0)
{
printf("%d", bestRoute[i]);
continue;
}
printf(" %d", bestRoute[i]);
}
printf(" %d %d\n", bestDis, bestCost);
return 0;
}