| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Keep WAing,my god!/***************************************
题目分析:POJ2513
先判断连通性(使用Union_Set)
再判断结点的度(用degree[]记录)
****************************************/
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;
#define REP(i,N) for(int i=0;i<N;i++)
#define REPV(i,ar) for(int i=0;i<ar.size();i++)
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define EACH(it,mp) for(__typeof(mp.begin()) it=mp.begin();it!=mp.end();it++)
#define sz size()
#define pb push_back
typedef vector<int> VI;
typedef vector<string> VS;
typedef __int64 ll;
//data
int degree[ 500010 ] = { 0 };
int uset[ 500010 ] = { -1 };
int col_num = 0;
class Num{
public:
int index;
Num* p[ 26 ];
public:
Num()
{
index = -1;
FOR( i, 0, 25 ) p[ i ] = NULL;
}
};
Num* ROOT;
int GetNum( char * str )
{
int num;
Num* P = ROOT;
FOR( i, 0, strlen( str ) - 1 )
{
int index = str[ i ] - 'a';
if( P->p[ index ] == NULL )
{
P->p[ index ] = new Num();
}
P = P->p[ index ];
}
if( P->index == -1 ) P->index = col_num++;
return P->index;
}
int uset_find( int inode )
{
if( uset[ inode ] < 0 ) return inode;
int j = inode;
while( uset[ j ] >= 0 )
{
j = uset[ j ];
}
uset[ inode ] = j;
return j;
}
int uset_union( int r1, int r2 )
{
if( r1 == r2 ) return 0;
if( uset[ r1 ] > uset[ r2 ] ) swap( r1, r2 );
uset[ r1 ] += uset[ r2 ];
uset[ r2 ] = r1;
return 0;
}
bool odd( int n )
{
return n % 2;
}
int main()
{
ROOT = new Num();
memset( uset, -1, sizeof( uset ) );
memset( degree, 0, sizeof( degree ) );
char color1[ 20 ];
char color2[ 20 ];
col_num = 0;
while( scanf( "%s%s", color1, color2 ) != EOF ){
int i = GetNum( color1 );//获取颜色编号 O(1)
int j = GetNum( color2 );//O(1)
++degree[ i ];
++degree[ j ];//记录度数
uset_union( uset_find( i ), uset_find( j ) );
}//while
if( uset[ uset_find( 0 ) ] + col_num != 0 )
{
printf( "Impossible\n" );
return 0;
}
int odd_num = count_if( degree, degree + col_num, odd );
if( odd_num <= 2 )
printf( "Possible\n" );
else
printf( "Impossible\n" );
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator