#include <iostream.h> #include <fstream.h> const MAX_COL = 110; const MAX = 110; // tasks for guys char T[MAX][MAX+1]; // E[i][0] - # of vertices connected to i; E[i][k] - vertex // connected to i int N, M; // N = left side, M = right side # of vertices char C[MAX][MAX]; // guy to index in T int maxCol = 0; // # of colours void DoMe() { // C[i][j] - color of edge from i to j != C[j][i] memset(C, 0, sizeof(C)); while (1) { int A, B, v, w; int i, j; v = -1; // find an edge not yet coloured for (i=1; (i <= N) && (v == -1); i++) for (j=1; (j <= T[i][0]) && (v == -1); j++) if (C[i][ j ] == 0) {v = i; w = j;}; if (v == -1) break; // **** v is a guy, w is an index into task ***** // find colours AB such that vw misses AB int Vcol[MAX_COL+1]; memset(Vcol, 0, sizeof(Vcol)); for (j=1; j <= T[v][0]; j++) Vcol[ C[v][ j ] ] = 1; // C[x][y] == 0 if not coloured for (j=1; j <= MAX_COL; j++) if (Vcol[j] == 0) {A = j; break;} int Wcol[MAX_COL+1]; memset(Wcol, 0, sizeof(Wcol)); // find all edges going into that task for (i=1; i <= N; i++) for (j=1; j <= T[i][0]; j++) if (T[i][j] == T[v][w]) Wcol[ C[i][j] ] = 1; for (j=1; j <= MAX_COL; j++) if (Wcol[j] == 0) {B = j; break;} if (A > maxCol) maxCol = A; if (B > maxCol) maxCol = B; // do the alternating path char GVis[MAX]; char TVis[MAX]; memset(GVis, 0, sizeof(GVis)); memset(TVis, 0, sizeof(TVis)); GVis[v] = 1; while (1) { int i, j; for (i=1; i <= N; i++) if (GVis[i] == 1) break; if (i <= N) { GVis[i] = 2; for (j=1; j <= T[i][0]; j++) if ((C[ i ][ j ] == A || C[i][ j ] == B) && !TVis[ T[i][j] ]) TVis[ T[i][j] ] = 1; } for (i=1; i <= M; i++) if (TVis[i] == 1) break; if (i > M) break; int x = i; TVis[i] = 2; // find all edges going into that task for (i=1; i <= N; i++) for (j=1; j <= T[i][0]; j++) if (T[i][j] == x && (C[i][j] == A || C[i][j] == B) && !GVis[i]) GVis[i] = 1; } // interchange if (Vcol[B] != 0 && Wcol[A] != 0) { for (int i=1; i <= N; i++) if (GVis[i]) for (int j=1; j <= T[i][0]; j++) if (TVis[ T[i][j] ]) // exchg. A&B if (C[i][ j ] == A) C[i][ j ] = B; else if (C[i][ j ] == B) C[i][ j ] = A; } // color memset(Vcol, 0, sizeof(Vcol)); memset(Wcol, 0, sizeof(Wcol)); for (j=1; j <= T[v][0]; j++) Vcol[ C[v][ j ] ] = 1; // find all edges going into that task for (i=1; i <= N; i++) for (j=1; j <= T[i][0]; j++) if (T[i][j] == T[v][w]) Wcol[ C[ i ][j] ] = 1; if (Vcol[A] == 0 && Wcol[A] == 0) C[v][w] = A; else if (Vcol[B] == 0 && Wcol[B] == 0) C[v][w] = B; else cout << "SHIT" << endl; } /* for (int i=1; i <= N; i++) for (int j=1; j <= E[i][0]; j++) cout << i << " " << E[i][j]-N << " = " << E[i][j] << " " << C[i][ E[i][j] ] << endl; */ } void main() { ifstream in; in.open("edge.in"); ofstream out; out.open("edge.out"); while (1) { in >> N >> M; if (N < 0) break; memset(T, 0, sizeof(T)); // assume integers 1..N on left side, 1..M on the right while (1) { int x, y, times; in >> x >> y >> times; if (x < 0) break; for (int ii=0; ii < times; ii++) { T[x][0] ++; T[x][ T[x][0] ] = y; } } DoMe(); out << maxCol << endl; for (int i=1; i <= maxCol; i++) { for (int j=1; j <= N; j++) for (int k=1; k <= T[j][0]; k++) if (C[j][ k ] == i) out << j << "(" << (int) T[j][k] << ")" << " "; out << endl; } } in.close(); out.close(); } Downloader failed! Response object 006~ASP 0159~Buffering Off~Buffering must be on.