题意:
1 #include<iostream> 2 #include<cmath> 3 #include<cstring> 4 #include<set> 5 #include<cstdio> 6 using namespace std; 7 #define MAXN 20000 8 int n; 9 int l,r; 10 int ans[MAXN]; 11 bool use[MAXN]; 12 pair<int,int> part[MAXN]; 13 int a[MAXN]; 14 set<int> opt[MAXN]; 15 int Q[MAXN]; 16 bool bfs(int left,int right) 17 { 18 set<int>::iterator te,p; 19 while(left<=right) 20 { 21 int x=Q[left++]; 22 use[x]=1; 23 te=opt[x].begin(); 24 int y=*te; 25 if(ans[*te]!=-1) 26 { 27 printf("No Answer\n"); 28 return 0; 29 } 30 ans[*te]=x; 31 if(x==part[y].first&&!use[part[y].second]) 32 { 33 int z=part[y].second; 34 p=opt[z].find(y); 35 opt[z].erase(p); 36 if(opt[z].size()==1) 37 Q[++right]=z; 38 } 39 if(x==part[y].second&&!use[part[y].first]) 40 { 41 int z=part[y].first; 42 p=opt[z].find(y); 43 opt[z].erase(p); 44 if(opt[z].size()==1) 45 Q[++right]=z; 46 } 47 } 48 l=left; r=right; 49 return 1; 50 } 51 void solve() 52 { 53 set<int>::iterator te,p; 54 int i; 55 l=1; r=0; 56 for(i=0;i<n;i++) 57 if(opt[i].size()==1) 58 Q[++r]=i; 59 if(!bfs(l,r)) 60 return ; 61 //for(i=0;i<n;i++) 62 //printf("%d ",ans[i]); 63 for(i=0;i<n;i++) 64 if(ans[i]<0) 65 { 66 int x=min(part[i].first,part[i].second); 67 Q[++r]=x; 68 te=opt[x].begin(); 69 if(te==opt[x].find(i)) 70 te++; 71 opt[x].erase(te); 72 if(!bfs(l,r)) 73 return ; 74 } 75 for(i=0;i<n-1;i++) 76 printf("%d ",ans[i]); 77 printf("%d\n",ans[n-1]); 78 } 79 int main() 80 { 81 memset(ans,0xff,sizeof(ans)); 82 memset(use,0,sizeof(use)); 83 scanf("%d",&n); 84 int i; 85 int x,y; 86 for(i=0;i<n;i++) 87 { 88 scanf("%d",a+i); 89 x=(i+a[i])%n; 90 y=(i-a[i]+n)%n; 91 part[i]=make_pair(x,y); 92 opt[x].insert(i); 93 opt[y].insert(i); 94 } 95 solve(); 96 return 0; 97 }