原题链接:蓝桥杯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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复