zoj 1060 Sorting It All Out

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1060

解题思路:拓扑排序

  1 ///////////////////////////////////////////////////////////////////////////
  2 //problem_id: zoj 1060
  3 //user_id: SCNU20102200088
  4 ///////////////////////////////////////////////////////////////////////////
  5 
  6 #include <algorithm>
  7 #include <iostream>
  8 #include <iterator>
  9 #include <iomanip>
 10 #include <cstring>
 11 #include <cstdlib>
 12 #include <string>
 13 #include <vector>
 14 #include <cstdio>
 15 #include <cctype>
 16 #include <cmath>
 17 #include <queue>
 18 #include <stack>
 19 #include <list>
 20 #include <set>
 21 #include <map>
 22 using namespace std;
 23 
 24 ///////////////////////////////////////////////////////////////////////////
 25 #pragma comment(linker,"/STACK:1024000000,1024000000")
 26 
 27 #define lson l,m,rt<<1
 28 #define rson m+1,r,rt<<1|1
 29 ///////////////////////////////////////////////////////////////////////////
 30 
 31 ///////////////////////////////////////////////////////////////////////////
 32 const double EPS=1e-9;
 33 const double PI=acos(-1.0);
 34 const double E=2.7182818284590452353602874713526;
 35 
 36 const int x4[]={-1,0,1,0};
 37 const int y4[]={0,1,0,-1};
 38 const int x8[]={-1,-1,0,1,1,1,0,-1};
 39 const int y8[]={0,1,1,1,0,-1,-1,-1};
 40 ///////////////////////////////////////////////////////////////////////////
 41 
 42 ///////////////////////////////////////////////////////////////////////////
 43 typedef long long LL;
 44 
 45 typedef int T;
 46 T max(T a,T b){ return a>b? a:b; }
 47 T min(T a,T b){ return a<b? a:b; }
 48 T gcd(T a,T b){ return b==0? a:gcd(b,a%b); }
 49 T lcm(T a,T b){ return a/gcd(a,b)*b; }
 50 ///////////////////////////////////////////////////////////////////////////
 51 
 52 ///////////////////////////////////////////////////////////////////////////
 53 //Add Code:
 54 int n,m,rd[30];
 55 char ans[30];
 56 vector<int> v[30];
 57 
 58 int TopSort(int k){
 59     int i,j,res=0,temp[30];
 60     for(i=1;i<=n;i++) temp[i]=rd[i];
 61     bool flag=1;
 62     while(k--){
 63         int cnt=0;
 64         for(i=1;i<=n;i++){
 65             if(temp[i]==0){
 66                 cnt++;
 67                 j=i;
 68             }
 69         }
 70         if(cnt==0) return -1;
 71         if(cnt>=1){
 72             if(cnt>1) flag=0;
 73             for(i=0;i<v[j].size();i++) temp[v[j][i]]--;
 74             ans[res++]=j+'A'-1;
 75             temp[j]=-1;
 76             ans[res]=0;
 77         }
 78     }
 79     if(flag) return res;
 80     return 0;
 81 }
 82 ///////////////////////////////////////////////////////////////////////////
 83 
 84 int main(){
 85     ///////////////////////////////////////////////////////////////////////
 86     //Add Code:
 87     int i,cnt;
 88     char c[5];
 89     bool flag[30];
 90     while(scanf("%d%d",&n,&m)!=EOF){
 91         if(n==0 && m==0) break;
 92         memset(rd,0,sizeof(rd));
 93         memset(flag,0,sizeof(flag));
 94         for(i=0;i<30;i++) v[i].clear();
 95         int num=0,judge=0;
 96         for(i=1;i<=m;i++){
 97             scanf("%s",c);
 98             if(judge==0){
 99                 int a=c[0]-'A'+1,b=c[2]-'A'+1;
100                 rd[b]++;
101                 v[a].push_back(b);
102                 if(!flag[a]){
103                     num++;
104                     flag[a]=1;
105                 }
106                 if(!flag[b]){
107                     num++;
108                     flag[b]=1;
109                 }
110                 int ret=TopSort(num);
111                 if(ret==-1){
112                     judge=-1;
113                     cnt=i;
114                 }
115                 else if(ret==n){
116                     judge=1;
117                     cnt=i;
118                 }
119             }
120         }
121         if(judge==-1) printf("Inconsistency found after %d relations.\n",cnt);
122         else if(judge==0) printf("Sorted sequence cannot be determined.\n");
123         else printf("Sorted sequence determined after %d relations: %s.\n",cnt,ans);
124     }
125     ///////////////////////////////////////////////////////////////////////
126     return 0;
127 }
128 
129 ///////////////////////////////////////////////////////////////////////////
130 /*
131 Testcase:
132 Input:
133 4 6
134 A<B
135 A<C
136 B<C
137 C<D
138 B<D
139 A<B
140 3 2
141 A<B
142 B<A
143 26 1
144 A<Z
145 0 0
146 Output:
147 Sorted sequence determined after 4 relations: ABCD.
148 Inconsistency found after 2 relations.
149 Sorted sequence cannot be determined.
150 */
151 ///////////////////////////////////////////////////////////////////////////

posted on 2013-09-18 19:46  SCNU20102200088  阅读(160)  评论(0编辑  收藏  举报

导航