Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
118 changes: 118 additions & 0 deletions 13307130389/assignment13.5/poj1094.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>

using namespace std ;

int n , m ;
int id[255] = {} ;
vector<char> e[255] ;
char ans[27] = {} ;
bool vis[255] = {} ;

const int SUC = 2 ;
const int FAIL = 1 ;
const int ELSE = 0 ;

int head = 1 , tail = 0 ;
bool inq[255] = {} ;
int Toposort(int maxn)
{
bool zerod = false ;
memset(inq, false ,sizeof(inq)) ;
head = 1 ; tail = 0 ;
char u ;
int cnt = 0 ;
int tid[255] = {} ;
for(char i = 'A' ; i <= 'Z' ; i ++) if( vis[i] )
{
tid[i] = id[i] ;
if( id[i] == 0 )
{
cnt ++ ;
u = i ;
ans[++ tail] = u ;
inq[u] = true ;
}
}
if( cnt == 0 ) return FAIL ;
if( cnt > 1 ) { zerod = true ; }
while( head <= tail )
{
u = ans[head ++] ;
for( vector<char>::iterator it = e[u].begin() ; it != e[u].end() ; it ++)
{
tid[*it] -- ;
if( inq[*it] )
return FAIL ;
}
cnt = 0 ;
for( char i = 'A' ; i <= 'Z' ; i ++) if( vis[i] )
if( !inq[i] && tid[i] == 0)
{
u = i ;
ans[++ tail] = u ;
inq[u] = true ;
cnt ++ ;
}
if( cnt > 1 ) { zerod = true ; }
}
if( tail < maxn ) return FAIL ;
if( zerod > 0 ) return ELSE ;
if( tail == n ) return SUC ;
return ELSE ;
}
int main()
{
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);

while( scanf("%d %d",&n,&m) == 2 )
{
if( n == 0 && m == 0 ) break ;
char s[5] = {} ;
bool flag = false ;
memset( vis , false , sizeof(vis) ) ;
int maxn = 0 ;
for(char i = 'A' ; i <= 'Z' ; i ++)
{
e[i].clear() ;
id[i] = 0 ;
}
for(int i = 1 ; i <= m ; i ++ )
{
scanf("%s",s);
if(flag) continue ;

id[s[2]] ++ ;
e[s[0]].push_back(s[2]);
if( !vis[s[0]] ) {vis[s[0]] = true ; maxn ++ ;}
if( !vis[s[2]] ) {vis[s[2]] = true ; maxn ++ ;}

if( i == 6 )
{
int temp = 0 ;
}
int status = Toposort(maxn) ;
if( status == SUC )
{
flag = true ;
printf("Sorted sequence determined after %d relations: ",i);
for(int j = 1 ; j <= n ; j ++)
printf("%c",ans[j]) ;
printf(".\n");
}
else if( status == FAIL )
{
printf("Inconsistency found after %d relations.\n",i);
flag = true ;
}
}
if( flag == false )
printf("Sorted sequence cannot be determined.\n");
}
return 0;
}
64 changes: 64 additions & 0 deletions 13307130389/assignment13.5/poj1125.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>

using namespace std;

const int oo = 99999999 ;

int f[100][100] = {} ;
int n , d[100] ;

int main()
{
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);

while( scanf("%d",&n) == 1 )
{
if(n == 0) break ;

for(int i = 1 ; i <= n ; i ++)
for(int j = 1 ; j <= n ; j ++)
f[i][j] = oo ;

for(int u = 1 ; u <= n ; u ++)
{
int c , v , w ;
scanf("%d",&c);
while(c --)
{
scanf("%d %d",&v,&w);
if( f[u][v] > w )
f[u][v] = w ;
}
}

for(int k = 1 ; k <= n ; k ++)
for(int i = 1 ; i <= n ; i ++)
for(int j = 1 ; j <= n ; j ++)
if( f[i][j] > f[i][k] + f[k][j] )
f[i][j] = f[i][k] + f[k][j] ;

int ii , ans = oo ;
for(int i = 1 ; i <= n ; i ++)
{
int tans = -1 ;
for(int j = 1 ; j <= n ; j ++) if( j != i )
{
if( f[i][j] > tans )
tans = f[i][j] ;
if( f[i][j] >= oo )
{ tans = -1 ; break ;}
}
if( tans >= 0 && tans < ans ) {ii = i ; ans = tans ;}
}
if( ans < oo )
printf("%d %d\n",ii , ans );
else
printf("disjoint\n");
}
return 0;
}
130 changes: 130 additions & 0 deletions 13307130389/assignment13.5/poj1128.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>

using namespace std ;

char mat[55][55] = {} ;
int n , m ;

int ind[256] = {} ;
bool e[256][256] = {} ;
int pos[256][4] = {} ;
bool valid[256] = {} ;
int tot = 0 ;
char s[30] = {} ;
int anscnt = 0;

bool ins[256] = {} ;
void Dfs( int cur , char u )
{
s[cur] = u ;
if( cur == tot - 1 )
{
printf("%s\n",s);
return ;
}
for(char v = 'A' ; v <= 'Z' ; v ++) if( valid[v] )
if( e[u][v] )
ind[v] -- ;
for(char v = 'A' ; v <= 'Z' ; v ++) if( valid[v] && !ins[v] )
if( ind[v] == 0 )
{
ins[v] = true ;
Dfs(cur + 1 , v) ;
ins[v] = false ;
}
for(char v = 'A' ; v <= 'Z' ; v ++) if( valid[v] )
if( e[u][v] )
ind[v] ++ ;
}

int main()
{
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);

while( scanf("%d\n%d\n",&n,&m) == 2 )
{
memset( ind , 0 , sizeof(ind) ) ;
memset( e , 0 , sizeof(e)) ;
memset(valid,false ,sizeof(valid));
tot = 0 ;
memset(s , 0 , sizeof(s)) ;
anscnt = 0 ;

for(int i = 1 ; i <= n ; i ++)
scanf("%s\n",mat[i]+1) ;

for(int i = 'A' ; i <= 'Z' ; i ++)
{
pos[i][0] = n+1 ; // top
pos[i][1] = m+1 ; // left
pos[i][2] = 0;// bottom
pos[i][3] = 0;// right
}

for(int i = 1 ; i <= n ; i ++)
for(int j = 1 ; j <= m ; j ++)
{
char c = mat[i][j] ;
if( c == '.' ) continue ;
pos[c][0] = min(pos[c][0],i) ;
pos[c][1] = min(pos[c][1],j) ;
pos[c][2] = max(pos[c][2],i) ;
pos[c][3] = max(pos[c][3],j) ;
valid[c] = true ;
}

for(char i = 'A' ; i <= 'Z' ; i ++) if( valid[i] )
{
tot ++ ;
for(int j = pos[i][1] ; j <= pos[i][3] ; j ++)
{
char v = mat[pos[i][0]][j] ;
if( v != '.' && v != i && !e[i][v])
{
e[i][v] = true ;
ind[v] ++ ;
}
v = mat[pos[i][2]][j] ;
if( v != '.' && v != i && !e[i][v])
{
e[i][v] = true ;
ind[v] ++ ;
}
}
for(int j = pos[i][0] ; j <= pos[i][2] ; j ++)
{
char v = mat[j][pos[i][1]] ;
if( v != '.' && v != i && !e[i][v])
{
e[i][v] = true ;
ind[v] ++ ;
}
v = mat[j][pos[i][3]] ;
if( v != '.' && v != i && !e[i][v])
{
e[i][v] = true ;
ind[v] ++ ;
}
}
}

for(char i = 'A' ; i <= 'Z' ; i ++) if( valid[i] )
{
if( ind[i] == 0 )
{
ins[i] = true ;
Dfs( 0 , i ) ;
ins[i] = false ;
}
}
}

return 0;
}
61 changes: 61 additions & 0 deletions 13307130389/assignment13.5/poj1182.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<vector>

using namespace std ;

int n , k ;
int fa[50005] = {} ;
int tag[50005] = {} ;

int Find(int x)
{
if( fa[x] == x ) return x ;
int fx = fa[x] ;
fa[x] = Find(fa[x]) ;
tag[x] = (tag[x] + tag[fx]) % 3 ;
return fa[x] ;
}
void Union(int d , int x , int y)
{
int fx = Find(x) , fy = Find(y) ;
fa[fy] = fx ;
tag[fy] = (tag[x]-tag[y]+d+2)%3 ;
}
int main()
{
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
int ans = 0 ;

scanf("%d %d",&n,&k);
for(int i = 1 ; i <= n ; i ++)
{
fa[i] = i ;
tag[i] = 0 ;
}
for(int i = 1 ; i <= k ; i ++)
{
int d , x , y;
scanf("%d %d %d",&d,&x,&y);

if( x > n || y > n || (x==y&&d!=1) )
{
ans ++ ;
continue ;
}
int fx = Find(x) ;
int fy = Find(y) ;
if( fx == fy )
{
if( (tag[y] - tag[x] + 3) % 3 != d - 1 )
ans ++ ;
}
else Union( d , x , y );
}
printf("%d",ans);
return 0;
}
Loading