#include
<
iostream
>
#include
<
stack
>
#include
<
vector
>
int
n, m;
int
degree[
26
];
int
data[
26
][
26
];
bool
exist[
26
];

std::vector
<
char
>
re;

int
length()

{
int
num
=
0
;
for
(
int
i
=
0
; i
<
n;
++
i )
if
( exist[i] )
num
++
;

return
num;
}
int
toplogicalsort()

{
std::stack
<
char
>
st;
int
*
d
=
new
int
[n];

re.clear ();

for
(
int
i
=
0
; i
<
n;
++
i )
d[i]
=
degree[i];

for
(
int
i
=
0
; i
<
n;
++
i )
if
( d[i]
==
0
&&
exist[i] )st.push(i);

bool
ok
=
true
;
while
(
!
st.empty() )

{
if
( (
int
)st.size ()
>
1
) ok
=
false
;

int
t
=
st.top ();
st.pop();

re.push_back ( t
+
'
A
'
);

for
(
int
i
=
0
; i
<
n;
++
i )
if
( data[i][t]
==
1
&&
exist[i] )

{
d[i]
--
;
if
( d[i]
==
0
) st.push (i);
}
}
int
len
=
length();
if
( (
int
)re.size ()
<
len )
return
2
;
//
exit circle
if
(
!
ok )
return
0
;
if
( (
int
)re.size ()
==
n )
return
1
;

return
0
;
}
int
main()

{
while
( scanf(
"
%d%d
"
,
&
n,
&
m), m
+
n
!=
0
)

{
memset( degree,
0
,
sizeof
(degree) );
memset( data,
0
,
sizeof
(data ) );
memset( exist,
false
,
sizeof
(exist) );

bool
isok
=
true
;
bool
determin
=
false
;
getchar();

for
(
int
i
=
1
; i
<=
m;
++
i )

{
char
a, b;

a
=
getchar();
getchar();
b
=
getchar();
getchar();

exist[a
-
'
A
'
]
=
true
;
exist[b
-
'
A
'
]
=
true
;

if
(
!
determin
&&
isok
&&
(data[a
-
'
A
'
][b
-
'
A
'
]
==
1
||
a
==
b) )

{
isok
=
false
;

printf(
"
Inconsistency found after %d relations.\n
"
, i);
}
if
( data[b
-
'
A
'
][a
-
'
A
'
]
==
0
) degree[b
-
'
A
'
]
++
;
data[b
-
'
A
'
][a
-
'
A
'
]
=
1
;

int
type;
if
(
!
determin
&&
isok
&&
(type
=
toplogicalsort()) )

{
if
( type
==
1
)

{
determin
=
true
;
printf(
"
Sorted sequence determined after %d relations:
"
, i );
for
( size_t x
=
0
; x
<
re.size ();
++
x )
printf(
"
%c
"
, re[x] );
printf(
"
.\n
"
);
}
else
if
( type
==
2
)

{
isok
=
false
;

printf(
"
Inconsistency found after %d relations.\n
"
, i);
}
}
}
if
(
!
determin
&&
isok ) printf(
"
Sorted sequence cannot be determined.\n
"
);
}
return
0
;
}
posted on 2008-10-03 01:35
Darren 阅读(233)
评论(0) 编辑 收藏 引用 所属分类:
图论