From bbf0015fbd3ee37c3c8d0ee57904df4fca622737 Mon Sep 17 00:00:00 2001 From: xiaoguai0992 <13307130389@fudan.edu.cn> Date: Mon, 22 Dec 2014 09:16:32 +0800 Subject: [PATCH] assignment13.5 --- 13307130389/assignment13.5/poj1094.cpp | 118 ++++++++++++++++++++++ 13307130389/assignment13.5/poj1125.cpp | 64 ++++++++++++ 13307130389/assignment13.5/poj1128.cpp | 130 +++++++++++++++++++++++++ 13307130389/assignment13.5/poj1182.cpp | 61 ++++++++++++ 13307130389/assignment13.5/poj1861.cpp | 80 +++++++++++++++ 13307130389/assignment13.5/poj2349.cpp | 70 +++++++++++++ 13307130389/assignment13.5/poj2367.cpp | 55 +++++++++++ 13307130389/assignment13.5/poj2560.cpp | 61 ++++++++++++ 13307130389/assignment13.5/poj3259.cpp | 78 +++++++++++++++ 13307130389/assignment13.5/poj3411.cpp | 68 +++++++++++++ 13307130389/assignment13.5/poj3615.cpp | 48 +++++++++ 11 files changed, 833 insertions(+) create mode 100644 13307130389/assignment13.5/poj1094.cpp create mode 100644 13307130389/assignment13.5/poj1125.cpp create mode 100644 13307130389/assignment13.5/poj1128.cpp create mode 100644 13307130389/assignment13.5/poj1182.cpp create mode 100644 13307130389/assignment13.5/poj1861.cpp create mode 100644 13307130389/assignment13.5/poj2349.cpp create mode 100644 13307130389/assignment13.5/poj2367.cpp create mode 100644 13307130389/assignment13.5/poj2560.cpp create mode 100644 13307130389/assignment13.5/poj3259.cpp create mode 100644 13307130389/assignment13.5/poj3411.cpp create mode 100644 13307130389/assignment13.5/poj3615.cpp diff --git a/13307130389/assignment13.5/poj1094.cpp b/13307130389/assignment13.5/poj1094.cpp new file mode 100644 index 0000000..9fc0dab --- /dev/null +++ b/13307130389/assignment13.5/poj1094.cpp @@ -0,0 +1,118 @@ +#include +#include +#include +#include +#include +#include + +using namespace std ; + +int n , m ; +int id[255] = {} ; +vector 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::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; +} diff --git a/13307130389/assignment13.5/poj1125.cpp b/13307130389/assignment13.5/poj1125.cpp new file mode 100644 index 0000000..373fa77 --- /dev/null +++ b/13307130389/assignment13.5/poj1125.cpp @@ -0,0 +1,64 @@ +#include +#include +#include +#include +#include + +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; +} diff --git a/13307130389/assignment13.5/poj1128.cpp b/13307130389/assignment13.5/poj1128.cpp new file mode 100644 index 0000000..bead3de --- /dev/null +++ b/13307130389/assignment13.5/poj1128.cpp @@ -0,0 +1,130 @@ +#include +#include +#include +#include +#include +#include +#include + +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; +} diff --git a/13307130389/assignment13.5/poj1182.cpp b/13307130389/assignment13.5/poj1182.cpp new file mode 100644 index 0000000..1a3be96 --- /dev/null +++ b/13307130389/assignment13.5/poj1182.cpp @@ -0,0 +1,61 @@ +#include +#include +#include +#include +#include +#include + +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; +} diff --git a/13307130389/assignment13.5/poj1861.cpp b/13307130389/assignment13.5/poj1861.cpp new file mode 100644 index 0000000..a4aa6b9 --- /dev/null +++ b/13307130389/assignment13.5/poj1861.cpp @@ -0,0 +1,80 @@ +#include +#include +#include +#include +#include + +using namespace std ; + +int fa[1005] = {} ; + +class Edge +{ +public: + int u , v , w ; + bool used ; + friend bool operator<(const Edge& x , const Edge& y) + { + return x.w < y.w ; + } + Edge() + { + u = v = w = 0 ; + used = 0 ; + } +}e[15005] ; +int cnt = 0 ; + +int n , m ; + +void init() +{ + scanf("%d %d",&n,&m); + for(int i = 1 ; i <= n ; i ++) + fa[i] = i ; + int u , v , w ; + for(int i = 1 ; i <= m ; i ++) + { + scanf("%d %d %d",&u,&v,&w); + e[cnt].u = u ; e[cnt].v = v ; e[cnt ++].w = w ; + } + sort( e , e + cnt ) ; +} + +int find(int x) { return (fa[x]==x)?x:(fa[x]=find(fa[x])) ;} + +int kruskal() +{ + int u , v , w ; + int num = 0 ; + for(int i = 0 ; i < m ; i ++) + { + int u , v , w ; + u = e[i].u ; v = e[i].v ; w = e[i].w ; + int x = find(u) , y = find(v) ; + if( x != y ) + { + e[i].used = true ; + fa[x] = y ; + num ++ ; + if( num == n - 1 ) + return e[i].w ; + } + } +} + +int main() +{ + freopen("in.txt","r",stdin); + freopen("out.txt","w",stdout); + + init() ; + int ans = kruskal() ; + + printf("%d\n%d\n",ans,n-1); + for(int i = 0 ; i < m ; i ++) + if( e[i].used ) + printf("%d %d\n", e[i].u,e[i].v ); + + return 0; +} diff --git a/13307130389/assignment13.5/poj2349.cpp b/13307130389/assignment13.5/poj2349.cpp new file mode 100644 index 0000000..33e5946 --- /dev/null +++ b/13307130389/assignment13.5/poj2349.cpp @@ -0,0 +1,70 @@ +#include +#include +#include +#include +#include +#include + +using namespace std ; + +int T ; +int m , n ; +const double oo = 99999999.0 ; + +double dis[505] = {} ; +double tree[505] = {} ; +int tree_cnt = 0 ; +bool vis[505] = {} ; + +typedef struct Node +{ + double x , y ; +}; + +Node nd[505] ; + +double dist(const Node& a , const Node& b ) +{ + return sqrt( (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) ) ; +} + +int main() +{ + freopen("in.txt","r",stdin); + freopen("out.txt","w",stdout); + + scanf("%d",&T) ; + while( T -- ) + { + scanf("%d %d",&m,&n); + tree_cnt = 0 ; + memset( vis , false , sizeof(vis) ) ; + for(int i = 0 ; i < n ; i ++) + { + scanf("%lf %lf",&nd[i].x,&nd[i].y); + dis[i] = oo ; + } + + dis[0] = 0 ; + int next = 0 ; + for(int k = 1 ; k < n ; k ++) + { + for(int i = 0 ; i < n ; i ++ ) + if( i != next && !vis[i] ) + if( dis[i] > dist(nd[next],nd[i]) ) + dis[i] = dist(nd[next],nd[i]) ; + vis[next] = true ; + double minw = oo ; + for(int i = 0 ; i < n ; i ++ ) + if( !vis[i] && dis[i] < minw ) + { + next = i ; + minw = dis[i] ; + } + tree[tree_cnt ++] = minw ; + } + sort( dis + 1 , dis + n ); + printf("%.2f\n",dis[n-m]) ; + } + return 0; +} diff --git a/13307130389/assignment13.5/poj2367.cpp b/13307130389/assignment13.5/poj2367.cpp new file mode 100644 index 0000000..9ef6abc --- /dev/null +++ b/13307130389/assignment13.5/poj2367.cpp @@ -0,0 +1,55 @@ +#include +#include +#include +#include +#include + +using namespace std ; + +vector e[105] ; +int n ; +int ind[105] = {} ; +int queue[105] = {} ; +int head = 1 , tail = 0 ; + +int main() +{ + freopen("in.txt","r",stdin); + freopen("out.txt","w",stdout); + + scanf("%d",&n); + for(int i = 1 ; i <= n ; i ++) + { + int v ; + while( scanf("%d",&v) == 1 ) + { + if( v == 0 ) break ; + e[i].push_back(v) ; + ind[v] ++ ; + } + } + + for(int i = 1; i <= n ; i ++) + { + if( ind[i] == 0 ) + { + queue[++ tail] = i ; + } + } + while( head <= tail ) + { + int u = queue[head ++] ; + printf("%d ",u) ; + for( vector::iterator it=e[u].begin();it!=e[u].end();it++) + { + int v = *it ; + ind[v] -- ; + if( ind[v] == 0 ) + { + queue[++ tail] = v ; + } + } + } + + return 0; +} diff --git a/13307130389/assignment13.5/poj2560.cpp b/13307130389/assignment13.5/poj2560.cpp new file mode 100644 index 0000000..d7f0a7d --- /dev/null +++ b/13307130389/assignment13.5/poj2560.cpp @@ -0,0 +1,61 @@ +#include +#include +#include +#include +#include +#include + +using namespace std ; + +int m , n ; +const double oo = 99999999.0 ; +double ans = 0 ; +double dis[505] = {} ; +bool vis[505] = {} ; + +typedef struct Node +{ + double x , y ; +}; + +Node nd[505] ; + +double dist(const Node& a , const Node& b ) +{ + return sqrt( (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) ) ; +} + +int main() +{ + freopen("in.txt","r",stdin); + freopen("out.txt","w",stdout); + + scanf("%d",&n); + for(int i = 0 ; i < n ; i ++) + { + scanf("%lf %lf",&nd[i].x,&nd[i].y); + dis[i] = oo ; + } + + dis[0] = 0 ; + int next = 0 ; + for(int k = 1 ; k < n ; k ++) + { + for(int i = 0 ; i < n ; i ++ ) + if( i != next && !vis[i] ) + if( dis[i] > dist(nd[next],nd[i]) ) + dis[i] = dist(nd[next],nd[i]) ; + vis[next] = true ; + double minw = oo ; + for(int i = 0 ; i < n ; i ++ ) + if( !vis[i] && dis[i] < minw ) + { + next = i ; + minw = dis[i] ; + } + ans += minw ; + } + printf("%.2f\n",ans) ; + + return 0; +} diff --git a/13307130389/assignment13.5/poj3259.cpp b/13307130389/assignment13.5/poj3259.cpp new file mode 100644 index 0000000..151f7b6 --- /dev/null +++ b/13307130389/assignment13.5/poj3259.cpp @@ -0,0 +1,78 @@ +#include +#include +#include +#include +#include + +using namespace std ; + +const int oo = 99999999 ; + +class Edge +{ +public: + int u , v , w ; +}e[5500] ; +int dis[505] = {} ; +int cnt = 0 ; +int F ; +int n , m , ww ; + +void init() +{ + scanf("%d %d %d",&n,&m,&ww); + int u , v, w ; + cnt = 0 ; + for(int i = 1 ; i <= n ; i ++) + dis[i] = oo ; + for(int i = 0 ; i < m ; i ++) + { + scanf("%d %d %d",&u,&v,&w) ; + e[cnt].u = u ; e[cnt].v = v ; e[cnt ++].w = w; + e[cnt].u = v ; e[cnt].v = u ; e[cnt ++].w = w; + } + for(int i = 0 ; i < ww ; i ++) + { + scanf("%d %d %d",&u,&v,&w) ; + e[cnt].u = u ; e[cnt].v = v ; e[cnt ++].w = -w ; + } +} + +bool BellmanFord() +{ + dis[1] = 0 ; + for(int i = 0 ; i < n - 1 ; i ++) + { + bool ok = false ; + for(int j = 0 ; j < cnt ; j ++) + if( dis[e[j].u] > dis[e[j].v] + e[j].w ) + { + dis[e[j].u] = dis[e[j].v] + e[j].w ; + ok = true ; + } + if( !ok ) break ; + } + for(int j = 0 ; j < cnt ; j ++) + if( dis[e[j].u] > dis[e[j].v] + e[j].w ) + return false ; + return true ; +} + +int main() +{ + freopen("in.txt","r",stdin); + freopen("out.txt","w",stdout); + + scanf("%d",&F); + while( F -- ) + { + init() ; + + if( BellmanFord() ) + printf("NO\n"); + else + printf("YES\n"); + } + + return 0; +} diff --git a/13307130389/assignment13.5/poj3411.cpp b/13307130389/assignment13.5/poj3411.cpp new file mode 100644 index 0000000..2b6781b --- /dev/null +++ b/13307130389/assignment13.5/poj3411.cpp @@ -0,0 +1,68 @@ +#include +#include +#include +#include +#include + +using namespace std ; + +int n , m ; + +class Edge +{ +public: + int a , b , c ; + int p , q ; +}e[15]; +int passcnt[15] = {} ; + +int ans = 99999999; + +void Dfs( int cur , int tot , int sta ) +{ + if( passcnt[cur] > 3 ) return ; + if( tot > ans ) return ; + if( cur == n ) + { + if( tot < ans ) + ans = tot ; + return ; + } + for(int i = 1 ; i <= m ; i ++) + { + if( cur == e[i].a ) + { + passcnt[e[i].b] ++ ; + if( (1 << (e[i].c-1)) & sta ) + Dfs( e[i].b , tot + e[i].p , sta | (1 << (e[i].b-1)) ); + else + Dfs( e[i].b , tot + e[i].q , sta | (1 << (e[i].b-1)) ); + passcnt[e[i].b] -- ; + } + } +} + +int main() +{ + freopen("in.txt","r",stdin); + freopen("out.txt","w",stdout); + + scanf("%d %d",&n,&m); + + for(int i = 1 ; i <= m ; i ++) + { + int a , b , c , p , q ; + scanf("%d %d %d %d %d",&a,&b,&c,&p,&q) ; + e[i].a = a ; + e[i].b = b ; + e[i].c = c ; + e[i].p = p ; + e[i].q = q ; + } + Dfs( 1 , 0 , 1 ) ; + if( ans < 99999999 ) + printf("%d",ans); + else + printf("impossible"); + return 0; +} diff --git a/13307130389/assignment13.5/poj3615.cpp b/13307130389/assignment13.5/poj3615.cpp new file mode 100644 index 0000000..c0d20a7 --- /dev/null +++ b/13307130389/assignment13.5/poj3615.cpp @@ -0,0 +1,48 @@ +#include +#include +#include +#include +#include + +using namespace std ; +const int oo = 99999999 ; + +int f[305][305] = {} ; +int n , m , t ; + +int main() +{ + freopen("in.txt","r",stdin); + freopen("out.txt","w",stdout); + + scanf("%d %d %d",&n,&m,&t); + for(int i = 1 ; i <= n ; i ++) + for(int j = 1 ; j <= n ; j ++) + { + f[i][j] = oo ; + } + for(int i = 0 ; i < m ; i ++) + { + int u , v , w ; + scanf("%d %d %d",&u,&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] > max(f[i][k],f[k][j]) ) + f[i][j] = max(f[i][k],f[k][j]) ; + + for(int i = 1 ; i <= t ; i ++) + { + int u , v ; + scanf("%d %d",&u,&v); + if( f[u][v] < oo ) + printf("%d\n",f[u][v]) ; + else printf("-1\n"); + } + + return 0; +}