文远知行笔试0731
三道编程题
1.骰子展开同一顶点的三个面之和有多少种可能?
枚举即可
2.一台电脑或三台电脑答题计分,最多答多少题?
简单模拟
3.n个点,m条边,k个标记点,s起点,t终点,问从s到t并且经过所有标记点的最短距离?
这个不知道是不是要迪杰斯特拉或者bfs?直接暴力回溯了,但是只过了18%,内存超限制或者是要怎么剪枝呢,我只剪了大于res的情况,路过的AC大佬麻烦评论区说一下呗:)
#include<bits/stdc++.h> using namespace std; int res=INT_MAX; //内存超限制 void dfs(vector<vector<pair<int, int>>>& graph,int path,int kk,int s,int t,vector<int>& mark) { if(kk==0 && s==t) { res = min(path,res); return; } for(int i=0;i<graph[s].size();++i) { if(path>res) return; auto [r,c] = graph[s][i]; path += c; if(mark[r]) { mark[r]=0; dfs(graph,path,kk-1,r,t,mark); mark[r]=1; }else { dfs(graph,path,kk,r,t,mark); } path -= c; } } int main() { int n,m,k,s,t; cin>>n>>m>>k>>s>>t; vector<vector<pair<int,int>>> graph(n+1); vector<int> mark(n+1,0); int kk=k; while(m--) { int a,b,c; cin>>a>>b>>c; graph[a].push_back({b,c}); } while(k--) { int d; cin>>d; mark[d]=1; } dfs(graph,0,kk,s,t,mark); res = res==INT_MAX?-1:res; cout<< res; }#文远知行#