USACO 1.3Wormholes
Posted 水郁
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了USACO 1.3Wormholes相关的知识,希望对你有一定的参考价值。
/* LANG: C++ TASK: wormhole n个洞,n<=12, 如果两洞配对,则它们之间有地下路径(无向) 牛在地上只会往+x方向 问多少种两两配对的方案,牛从地上某位置出发,会陷入无限循环。 SOLVE: 枚举所有配对方案,判断是否会进入无限循环。 */ #include <cstdio> #include <algorithm> #include <cstring> using namespace std; #define N 15 int n,to[N],v[N],ans,vis[N]; struct node{ int x,y,id; }a[N]; int cmp(node a,node b){ return a.x<b.x; } void dfs(int x){ if(x>n){ for(int i=1;i<=n;i++){//枚举每个洞进去 x=i; memset(vis,0,sizeof vis); while(x){//还能走 vis[x]=1; if(vis[to[v[x]]]){//下一个要进去的洞进去过 ans++; return; } x=to[v[x]]; } } } if(v[x]){ dfs(x+1); return; } for(int i=x+1;i<=n;i++) if(!v[i]){ v[i]=x; v[x]=i; dfs(x+1); v[i]=v[x]=0; } } int main(){ freopen("wormhole.in","r",stdin); freopen("wormhole.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y); sort(a+1,a+1+n,cmp); for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) if(a[i].y==a[j].y){ to[i]=j; break; } dfs(1); printf("%d\n",ans); }
以上是关于USACO 1.3Wormholes的主要内容,如果未能解决你的问题,请参考以下文章
bzoj1715[Usaco2006 Dec]Wormholes 虫洞*