解题思路: 从每头奶牛的节点开始做搜索,用dfs走遍所有路径(走到底,不回头)。每遍历到一个节点该节点遍历次数就加一,最后所有奶牛都搜索完之后,检查每个节点的遍历次数,如果该节点的遍历次数等于奶牛数则该节点能被所有奶牛走到。

坑:

1.每头奶牛搜索的时候要有清空的vis数组记录走没走过该点,否则可能路径会重复循环。

2.要用邻接矩阵mp[i][j]来记录节点的连接关系 ,其中i 是起点的编号 , j  是终点的编号, 矩阵的值为1时表示i 到 j 可以连接,0表示没有。

 1 #include<bits/stdc++.h>
2 using namespace std;
3 const int N=1010;
4 int k,n,m,l[N]={0},vis[N]={0},mp[N][N]={0},vis1[N]={0};
5 void dfs(int x)
6 {
7 vis1[x]=1;
8 vis[x]++;
9 for(int i=1;i<=n;i++)
10 {
11 if(mp[x][i]==1&&vis1[i]==0)
12 {
13 dfs(i);
14 }
15 }
16 }
17 int main()
18 {
19 cin>>k>>n>>m;
20 for(int i=1;i<=k;i++)
21 {
22 scanf("%d",&l[i]);
23 }
24 for(int i=1;i<=m;i++)
25 {
26 int a1,b;
27 scanf("%d%d",&a1,&b);
28 mp[a1][b]=1;
29 }
30 for(int i=1;i<=k;i++)
31 {
32 memset(vis1,0,sizeof(vis1));
33 dfs(l[i]);
34 }
35 int ans=0;
36 for(int i=1;i<=n;i++)
37 {
38 if(vis[i]==k) ans++;
39 }
40 cout<<ans<<endl;
41 return 0;
42 }

更新了:

有优化方案:

新思路≈图存储方式、遍历方式优化

就用一个vector(二维)来记录一个节点跟所有连接节点的关系。

还有亿个细节值得注意:

因为这里是有向表所以 1 edge[a1].push_back(b);

如果是无向表 1 edge[a1].push_back(b); 2 edge[b].push_back(a1);

以及dfs中的for循环要改一下。i的范围:  [0,edge[x].size()-1]

效果:

存储效率,循环效率更高

效果如图所示,提交编号为188624的为优化前的提交记录耗时80ms,提交编号为189772的为优化后的提交记录耗时9ms

程序:

 1 #include<bits/stdc++.h>
2 using namespace std;
3 const int N=1005;
4 int k,n,m,l[N]={0},vis[N]={0},mp[N][N]={0},vis1[N]={0};
5 vector<int> edge[N];
6 void dfs(int x)
7 {
8 vis1[x]=1;
9 vis[x]++;
10 for(int i=0;i<edge[x].size();i++)
11 {
12 if(vis1[edge[x][i]]==0)
13 {
14 dfs(edge[x][i]);
15 }
16 }
17 }
18 int main()
19 {
20 cin>>k>>n>>m;
21 for(int i=1;i<=k;i++)
22 {
23 scanf("%d",&l[i]);
24 }
25 for(int i=1;i<=m;i++)
26 {
27 int a1,b;
28 scanf("%d%d",&a1,&b);
29 edge[a1].push_back(b);
30 }
31 for(int i=1;i<=k;i++)
32 {
33 memset(vis1,0,sizeof(vis1));
34 dfs(l[i]);
35 }
36 int ans=0;
37 for(int i=1;i<=n;i++)
38 {
39 if(vis[i]==k) ans++;
40 }
41 cout<<ans<<endl;
42 return 0;
43 }

最新文章

  1. 掌握 Linux PC 性能之基准测试
  2. node01-创建服务器
  3. Android 基于Android的手机邮件收发(JavaMail)之二( Welcome.java 和 ReceiveAndSend.java )
  4. svn恢复被删除的分支 svn del 分支
  5. Unity-Animator深入系列---FAQ
  6. javascript闭包的理解
  7. SQL Server手工插入标识列
  8. sqlcommand循环内使用
  9. JS弄ASP.NET(C#)在页GridView信息选择行
  10. windows MySQL 安装
  11. Android Studio的使用(六)
  12. VS启动Winform项目提示:不支持互操作调试
  13. webpack模块定义和使用的模式
  14. canvas-0trasform.html
  15. C:\\MFC控件大小随窗体大小而改变
  16. Cause: org.xml.sax.SAXParseException; lineNumber: 45; columnNumber: 62; 元素内容必须由格式正确的字符数据或标记组成。
  17. java核心技术-多线程之线程基础
  18. Android登录模块原理及实现
  19. eclipse因为js validator无法通过导致build workspace失败
  20. Calculator PartⅢ

热门文章

  1. docker+nginx 安装部署修改资源目录配置文件和容器端口信息
  2. Kubernetes_Deployment全解析(无状态的Pod)
  3. 【Java并发008】原理层面:ReentrantLock中 await()、signal()/signalAll()全解析
  4. Windows server 2008 tomcat间歇性掉线关闭
  5. uni 结合vuex 编写动态全局配置变量 this.baseurl
  6. Tekton 设计简介 及 实践
  7. 记一次InputStream流读取不完整留下的惨痛教训
  8. jQuery使用 前端框架Bootstrap
  9. Python免杀过360
  10. JavaScript:立即执行函数