总结:
1.常规套路,关键想想怎么存储图,然后就easy了
代码:
#include<iostream>
#include<vector>
#include<map>
using namespace std;
int vi[600];
struct road{
int st;
int end;
int cost;
int dis;
};
vector<vector<road> > pp;
map<int, vector<vector<int>>>sg;
int n, m, s, d;
int best[1000][1000];
int minlen = 99999999, totalen = 0;
int mincost = 999999, totalcost = 0;
void dfs(int index,vector<int>sh)
{
if (index == d)
{
if (minlen > totalen){ minlen = totalen; mincost = totalcost; sg[minlen].push_back(sh); }
else if (minlen == totalen&&mincost > totalcost){ minlen = totalen; mincost = totalcost; sg[minlen].push_back(sh); }
return;
}
vi[index] = 1;
for (int i = 0; i < pp[index].size(); i++)
{
if (vi[pp[index][i].end] == 0)
{
totalen += pp[index][i].dis;
totalcost += pp[index][i].cost;
sh.push_back(pp[index][i].end);
dfs(pp[index][i].end,sh);
totalen -= pp[index][i].dis;
totalcost -= pp[index][i].cost;
sh.pop_back(); vi[pp[index][i].end] = 0;
}
}
}
int main()
{
cin >> n >> m >> s >> d;
pp.resize(n);
for(int i = 0; i < m; i++)
{
road s; road ps;
scanf(“%d%d%d%d”,&s.st,&s.end,&s.dis,&s.cost);
ps.st = s.end; ps.end = s.st; ps.dis = s.dis; ps.cost = s.cost;
pp[s.st].push_back(s); pp[ps.st].push_back(ps);
}
vector<int> sh;
sh.push_back(s);
dfs(s,sh);
for (int i = 0; i < sg[minlen][sg[minlen].size() – 1].size(); i++)
printf(“%d “, sg[minlen][sg[minlen].size() – 1][i]);
cout << minlen << ” ” << mincost;
return 0;
}