[USACO1.3]虫洞wormhole

大意 给定一些点,在横向穿过这些点时将会被传送回纵坐标相同的 y y y轴上,问有多少种情况会使得永远向右爬的虫子陷入死循环
思路 【[USACO1.3]虫洞wormhole】首先因为只会向右爬,所以我们只需将同一行上的点间连边,然后 d f s dfs dfs暴力找匹配,之后判环即可
代码

/* ID:hzbismy1 LANG:C++ TASK:wormhole */ #include #include #include #define x second #define y first using namespace std; int n,to[20],pre[20],ans; bool vis[20]; pairp[20]; inline bool check(register int k)//判环 { while(to[k]) { if(vis[k]) return true; vis[k]=true; k=pre[to[k]]; } return false; } inline void dfs(register int dep)//暴力找匹配 { if(dep>n) { for(register int i=1; i<=n; i++) { fill(vis+1,vis+1+n,0); if(check(i)){ans++; return; } } return; } if(pre[dep]) dfs(dep+1); else { for(register int i=dep+1; i<=n; i++) if(!pre[i]) { pre[i]=dep; pre[dep]=i; dfs(dep+1); pre[i]=0; pre[dep]=0; } } } signed main() { freopen("wormhole.in","r",stdin); freopen("wormhole.out","w",stdout); scanf("%d",&n); for(register int i=1; i<=n; i++) scanf("%d%d",&p[i].x,&p[i].y); sort(p+1,p+1+n); for(register int i=1; i

    推荐阅读