- 10 3 3 5
- 6 7 0
- 0 1 1
- 0 2 1
- 0 3 3
- 1 3 1
- 2 3 1
3 0->2->3 0
题目大意
给定一个无向图,某一点抵达固定一点的最短距离。如果最短距离相同,那就选择需要带出单车数量最少的,如果还不唯一,那就继续选择且带回单车最少的那条路。
带出数量 : 为沿途补全节点为完满状态所需单车的数量
思路
DFS全线暴力搜索
- #include
- using namespace std;
- void findRoad(int now,int sumLen,int flag1,int flag2);
- vector<int> road[501],key,result;
- int MAX1,MAX2,N,ed,K,nums[501],len[501][501];
- int minLen=INT32_MAX,flag1Key,flag2Key;
- int main()
- {
- int a,b,c;
- cin >> MAX1 >> N >> ed >> K;
- for(int z=1;z<=N;z++) cin >> nums[z];
- nums[0] = MAX2 = MAX1/2;
- while (K--){
- cin >> a >> b >> c;
- road[a].push_back(b);
- road[b].push_back(a);
- len[a][b] = len[b][a] = c;
- }
-
- findRoad(0,0,0,0);
- cout << flag1Key << " ";
- for(int x:result) cout << x << "->";
- cout << ed << " " << flag2Key;
- return 0;
- }
- bool apr[501];
- void findRoad(int now,int sumLen,int flag1,int flag2) // f1 带出量, f2 带回量
- {
- // cout << now << " " << sumLen << " " << flag1 << endl;
- if(apr[now] || sumLen>minLen) return;
- if(now==ed){
- bool flag = false;
- if(sumLen
true; - else if(sumLen==minLen){
- if(flag1
- flag = true;
- }
- else if(flag1==flag1Key && flag2
- flag = true;
- }
- }
- if(flag) {
- result.assign(key.begin(),key.end());
- minLen = sumLen;
- flag1Key = flag1;
- flag2Key = flag2;
- }
- }else{
- key.push_back(now);
- apr[now] = true;
- int flag11,flag22;
- for(int x:road[now]) {
- flag22 = flag2 + nums[x] - MAX2;
- flag11 = flag1;
- if(flag22<0) {
- flag11 -= flag22;
- flag22 = 0;
- }
- findRoad(x,sumLen+len[x][now],flag11,flag22);
- }
-
- apr[now] = false;
- key.pop_back();
- }
- }

-
相关阅读:
Lua博客网站支持搜索、评论、登录注册
centos安装git
java自定义注解
C# CEFSharp WPF开发桌面程序实现“同一网站多开”
哈希(含原码)
Java-字符编码-roadmap
docker交叉编译 x86_64 => arm64(aarch64) 注册事项
【VPX637】基于XCKU115 FPGA+ZU15EG MPSOC的6U VPX双FMC接口通用信号处理平台
Arthas(阿尔萨斯)使用手册
C++中静态成员变量和普通成员变量、私有成员变量和公有成员变量的区别
-
原文地址:https://blog.csdn.net/daybreak_alonely/article/details/127684455