解题思路:
对于关键点的理解:关键点的特点就是所有可行通道都要经过它,那么在搜索过程中,每找到一个可行通道,把这个通道上所有的点计数,记录这个站点i被走过的次数a【i】,最后搜索完遍历站点进行检验,如果可行通道数等于这个点被走过的次数,说明它就是关键点
注意事项:注意一些判断前提
参考代码:
#include<bits/stdc++.h> using namespace std; bool vis[1005]; bool tx[1005][1005]; int a[1005]; int n,m,u,v,ans; bool f; void dfs(int x){ if(x==v){ f=true; ans++;//从u走到v道路++ for(int i=1;i<=n;i++){ if(vis[i]) //特别容易遗漏 ,只有被访问过才能计数,不然每次都全部计数了一遍 a[i]++;//道路上所有点计数++,,如果时关键点(说明是必经之路),特点:所有可行道路都应该通过它, } return ; } for(int i=1;i<=n;i++){ if(!vis[i]&&tx[x][i]){ vis[i]=true; dfs(i); vis[i]=false; } } } int main(){ cin>>n>>m; for(int i=1;i<=m;i++){ int x,y; cin>>x>>y; tx[x][y]=true;//x到y可以通行 tx[y][x]=true;//注意这里也要标记,否则会重复搜索 } cin>>u>>v; dfs(u); int cnt=0; for(int i=1;i<=n;i++){ if(i!=u&&i!=v&&ans==a[i]){//找到关键点(除了起终点必经之点,每条路都要经过) cnt++; } } if(f) cout<<cnt; else cout<<-1; return 0; }
0.0分
0 人评分
【计算直线的交点数】 (C语言代码)浏览:1443 |
1113题解浏览:784 |
打印十字图 (C语言代码)浏览:2701 |
A+B for Input-Output Practice (IV) (C语言代码)浏览:484 |
C语言程序设计教程(第三版)课后习题12.2 (C语言代码)浏览:753 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:463 |
C语言程序设计教程(第三版)课后习题7.3 (C语言代码)浏览:527 |
找出最长的字符串来 (C语言代码)浏览:1762 |
【计算直线的交点数】 (C语言代码)浏览:917 |
A+B for Input-Output Practice (IV) (C语言代码)浏览:503 |