传递闭包:给了 a 与 b 的关系,又给了 b 与 c 的关系,我们可以推测出 a 与 c 的关系,这个过程就是传递闭包。 过程
for_ ( k, 1 , n)
for_ ( i, 1 , n)
for_ ( j, 1 , n)
{
if ( g[ i] [ j] == 0 )
g[ i] [ j] = ( g[ i] [ k] & g[ k] [ j] ) ;
}
传递闭包经常与 Typo 一起使用,在传递闭包求出先后、比较、优先级关系之后用 Typo_sort 求出这个顺序就行了
Cow Contest POJ - 3660 代码
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <string>
#include <queue>
#include <map>
#include <bitset>
#include <vector>
using namespace std;
void fre ( ) { system ( "clear" ) , freopen ( "A.txt" , "r" , stdin ) ; freopen ( "Ans.txt" , "w" , stdout ) ; }
void Fre ( ) { system ( "clear" ) , freopen ( "A.txt" , "r" , stdin ) ; }
void Run ( int x = 0 ) {
#ifdef ACM
if ( ! x) fre ( ) ; else Fre ( ) ;
#endif
}
#define ios ios::sync_with_stdio(false)
#define Pi acos(-1)
#define pb push_back
#define fi first
#define se second
#define db double
#define ll long long
#define ull unsigned long long
#define Pir pair<ll, ll>
#define m_p make_pair
#define for_(i, s, e) for(ll i = (ll)(s); i <= (ll)(e); i ++)
#define rep_(i, e, s) for(ll i = (ll)(e); i >= (ll)(s); i --)
#define memset(a, b, c) memset(a, (int)b, c);
#define size() size() * 1LL
#define sc scanf
#define pr printf
#define sd(a) sc("%lld", &a)
#define ss(a) sc("%s", a)
#define __ pr( "------------------------\n" );
#define ___ pr("\n------------------------\n");
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define esp 1e-7
#define mod (ll)(1e9 + 7)
const ll mxn = 105 ;
ll n, m;
ll g[ mxn] [ mxn] ;
void init ( ll n)
{
for_ ( i, 1 , n)
for_ ( j, i, n)
{
if ( i == j) g[ i] [ j] = 1 ;
else g[ i] [ j] = g[ j] [ i] = 0 ;
}
}
int main ( )
{
Run ( ) ;
sc ( "%lld %lld" , & n, & m) ;
init ( n) ;
ll u, v;
for_ ( i, 1 , m)
{
sc ( "%lld %lld" , & u, & v) ;
g[ v] [ u] = 1 ;
}
for_ ( k, 1 , n)
for_ ( i, 1 , n)
for_ ( j, 1 , n)
{
if ( g[ i] [ j] == 0 )
g[ i] [ j] = ( g[ i] [ k] & g[ k] [ j] ) ;
}
ll ans = 0 ;
for_ ( i, 1 , n)
{
ll flag = 1 ;
for_ ( j, 1 , n)
{
if ( g[ i] [ j] == 0 && g[ j] [ i] == 0 )
{
flag = 0 ;
break ;
}
}
ans + = flag;
}
pr ( "%lld\n" , ans) ;
return 0 ;
}
Sorting It All Out POJ - 1094 (floyed + Typo_sort)
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <string>
#include <queue>
#include <map>
#include <bitset>
#include <vector>
using namespace std;
void fre ( ) { system ( "clear" ) , freopen ( "A.txt" , "r" , stdin ) ; freopen ( "Ans.txt" , "w" , stdout ) ; }
void Fre ( ) { system ( "clear" ) , freopen ( "A.txt" , "r" , stdin ) ; }
void Run ( int x = 0 ) {
#ifdef ACM
if ( ! x) fre ( ) ; else Fre ( ) ;
#endif
}
#define ios ios::sync_with_stdio(false)
#define Pi acos(-1)
#define pb push_back
#define fi first
#define se second
#define db double
#define ll long long
#define ull unsigned long long
#define Pir pair<ll, ll>
#define m_p make_pair
#define for_(i, s, e) for(ll i = (ll)(s); i <= (ll)(e); i ++)
#define rep_(i, e, s) for(ll i = (ll)(e); i >= (ll)(s); i --)
#define memset(a, b, c) memset(a, (int)b, c);
#define size() size() * 1LL
#define sc scanf
#define pr printf
#define sd(a) sc("%lld", &a)
#define ss(a) sc("%s", a)
#define __ pr( "------------------------\n" );
#define ___ pr("\n------------------------\n");
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define esp 1e-7
#define mod (ll)(1e9 + 7)
const ll mxn = 30 ;
ll n, m;
ll g[ mxn] [ mxn] ;
ll in[ mxn] , tim[ mxn] , idx;
struct Edge
{
ll v, nxt;
} edge[ mxn * mxn << 1 ] ;
ll head[ mxn] , tot;
Pir p[ mxn * mxn] ;
void init ( ll n)
{
memset ( g, 0 , sizeof g) ;
memset ( in, 0 , sizeof in) ;
memset ( head, 0 , sizeof head) ;
tot = 0 ;
}
void Add ( ll u, ll v)
{
edge[ ++ tot] . v = v;
edge[ tot] . nxt = head[ u] ;
head[ u] = tot;
}
bool floyed ( )
{
for_ ( k, 1 , n)
for_ ( i, 1 , n)
for_ ( j, 1 , n)
if ( g[ i] [ j] == 0 ) g[ i] [ j] = g[ i] [ k] & g[ k] [ j] ;
for_ ( i, 1 , n)
{
for_ ( j, 1 , n)
{
if ( i == j) continue ;
if ( ( g[ i] [ j] && g[ j] [ i] ) || ( ! g[ i] [ j] && ! g[ j] [ i] ) )
return 0 ;
}
}
return 1 ;
}
bool check ( )
{
for_ ( i, 1 , n)
{
for_ ( j, 1 , n)
{
if ( i == j) continue ;
if ( g[ i] [ j] == 1 && g[ j] [ i] == 1 )
{
return 0 ;
}
}
}
return 1 ;
}
void Typo_sort ( )
{
queue< ll> q;
idx = 0 ;
for_ ( i, 1 , n)
{
if ( in[ i] == 0 )
{
q. push ( i) ;
}
}
while ( q. size ( ) )
{
ll u = q. front ( ) ; q. pop ( ) ;
tim[ ++ idx] = u;
for ( ll i = head[ u] ; i; i = edge[ i] . nxt)
{
ll v = edge[ i] . v;
in[ v] -- ;
if ( ! in[ v] )
{
q. push ( v) ;
}
}
}
}
int main ( )
{
Run ( ) ;
while ( sc ( "%lld %lld " , & n, & m) && n + m)
{
init ( n) ;
char x, y;
for_ ( i, 1 , m)
{
sc ( "%c<%c " , & x, & y) ;
p[ i] = m_p ( x - 'A' + 1 , y - 'A' + 1 ) ;
}
ll flag = 0 ;
for_ ( i, 1 , m)
{
g[ p[ i] . fi] [ p[ i] . se] = 1 ;
Add ( p[ i] . fi, p[ i] . se) ;
in[ p[ i] . se] ++ ;
if ( floyed ( ) )
{
flag = 1 ;
Typo_sort ( ) ;
pr ( "Sorted sequence determined after %lld relations: " , i) ;
for_ ( i, 1 , idx)
{
pr ( "%c" , tim[ i] + 'A' - 1 ) ;
}
pr ( ".\n" ) ;
break ;
}
else
{
if ( ! check ( ) )
{
flag = 1 ;
pr ( "Inconsistency found after %lld relations.\n" , i) ;
break ;
}
}
}
if ( flag == 0 )
{
pr ( "Sorted sequence cannot be determined.\n" ) ;
}
}
return 0 ;
}