【USACO 1.3】Wormholes
/* 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); }
┆凉┆暖┆降┆等┆幸┆我┆我┆里┆将┆ ┆可┆有┆谦┆戮┆那┆ ┆大┆始┆ ┆然┆
┆薄┆一┆临┆你┆的┆还┆没┆ ┆来┆ ┆是┆来┆逊┆没┆些┆ ┆雁┆终┆ ┆而┆
┆ ┆暖┆ ┆如┆地┆站┆有┆ ┆也┆ ┆我┆ ┆的┆有┆精┆ ┆也┆没┆ ┆你┆
┆ ┆这┆ ┆试┆方┆在┆逃┆ ┆会┆ ┆在┆ ┆清┆来┆准┆ ┆没┆有┆ ┆没┆
┆ ┆生┆ ┆探┆ ┆最┆避┆ ┆在┆ ┆这┆ ┆晨┆ ┆的┆ ┆有┆来┆ ┆有┆
┆ ┆之┆ ┆般┆ ┆不┆ ┆ ┆这┆ ┆里┆ ┆没┆ ┆杀┆ ┆来┆ ┆ ┆来┆