原题链接:蓝桥杯2013年第四届真题-危险系数
解题思路:
关键点=所有路径中都出现的节点的数目-2 所有路径中都出现的节点判断依据为:该节点在所有路径中出现的个数==路径数 (即未出现在所有路径的节点 其一共出现的次数一定小于路径数)
注意事项:
无,DFS即可
参考代码:
#include<iostream> #include<vector> #include<map> #include<set> using namespace std; vector<int> vec[2000]; int n,m; int first,last; map<int,int> ans; //记录所有路径中出现节点的相应个数 set<int> kind; //记录所有路径中出现的节点种类 int number=0; //路径数 int flag[2000]={0}; void fun(int a,vector<int> len) { if(a==last) { for(int i=0;i<len.size();i++) { //cout<<len[i]<<endl; ans[len[i]]++; kind.insert(len[i]); } number++; return; } for(int i=0;i<vec[a].size();i++) { if(flag[vec[a][i]]==1) continue; //cout<<vec[a][i]<<endl; flag[vec[a][i]]=1; len.push_back(vec[a][i]); fun(vec[a][i],len); len.pop_back(); flag[vec[a][i]]=0; } return; } int main() { cin>>n>>m; for(int i=0;i<m;i++) { int temp1,temp2; cin>>temp1>>temp2; vec[temp1].push_back(temp2); vec[temp2].push_back(temp1); } cin>>first>>last; vector<int> len; len.push_back(first); flag[first]=1; fun(first,len); //cout<<number<<endl; //路径数 int ans2=0; for(set<int>::iterator t=kind.begin();t!=kind.end();t++) { if(ans[*t]==number&&*t!=first&&*t!=last) //ans[*t]==number即每条路径上都出现了这几个节点 ans2++; //cout<<*t<<endl; } cout<<ans2<<endl; return 0; }
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复