CodeForces-1276#B 题解
正文
这是样例 1 第 1 组数据的图。
让我们观察一下,路径 1->6、1->7、2->6、2->7 是可行的,所以答案为 4。
上述路径中好像点 4 没有贡献?
再看看样例 1 第 2 组数据的图。
发现点 1 和点 4 相互之间存在其他路径,无需经过点
综上,我们可以知道:在
可以看作
因此,我们只要找
接下来,只要找隔开的点的数量就可以。
考虑 DFS,对
那就可以写代码力。
#define by_wanguan #include<iostream> #include<vector> #include<cstring> #define int long long const int N=2e5+7; using namespace std; int T,n,m,a,b; vector<int> g[N]; bool vis[N],vis_[N]; inline int dfsb(int x){ vis[x]=1; int ret=1; if(x==a) {vis[x]=0; return 0;} for(int &i: g[x]){ if(vis[i]) continue; int s=dfsb(i); if(s==0&&x!=b) {vis[x]=0; return 0;} ret+=s; } return ret; } inline int dfsa(int x){ vis_[x]=1; int ret=1; if(x==b) {vis_[x]=0; return 0;} for(int &i: g[x]){ if(vis_[i]) continue; int s=dfsa(i); if(s==0&&x!=a) {vis_[x]=0; return 0;} ret+=s; } return ret; } signed main(){ ios::sync_with_stdio(false),cin.tie(0); cin>>T; while(T--){ cin>>n>>m>>a>>b; memset(vis,0,sizeof vis); memset(vis_,0,sizeof vis_); for(int i=1;i<=n;i++) g[i].clear(); for(int i=1,a,b;i<=m;i++) cin>>a>>b, g[a].emplace_back(b), g[b].emplace_back(a); int aa=dfsa(a)-1,bb=dfsb(b)-1; cout<<aa*bb<<'\n'; } }
提交记录。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步