Cod sursa(job #77158)

Utilizator DastasIonescu Vlad Dastas Data 13 august 2007 15:04:32
Problema Critice Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 5.24 kb
#include <cstdio>
#include <cstring>

const int maxn = 1001;
const int maxm = 10000;

FILE *in = fopen("critice.in","r"), *out = fopen("critice.out","w");

struct muchie
{
	short x, y, c;
};

int n, m;

short *a[maxn];
short *b[maxn];
short f[maxn][maxn];

short viz[maxn];
short C[maxn];

muchie mc[maxm];
short crit[maxn];


void read()
{
	fscanf(in, "%d %d", &n, &m);

    short cnt[maxn];
	for ( int i = 0; i < m; ++i )
	{
		fscanf(in, "%hd %hd %hd", &mc[i].x, &mc[i].y, &mc[i].c);
		++cnt[ mc[i].x ], ++cnt[ mc[i].y ];
	}

	for ( int i = 1; i <= n; ++i )
	{
        a[i] = new short[ cnt[i]+1 ], b[i] = new short[ cnt[i]+1 ];
        a[i][0] = b[i][0] = cnt[i];
        cnt[i] = 0;
	}

    for ( int i = 0; i < m; ++i )
    {
        int x = mc[i].x, y = mc[i].y;
        ++cnt[x], ++cnt[y];
        a[x][ cnt[x] ] = mc[i].c, b[x][ cnt[x] ] = y;
        a[y][ cnt[y] ] = mc[i].c, b[y][ cnt[y] ] = x;
    }
}

int findway()
{
	int p = 0, u = 0;
	memset(viz, 0, sizeof(viz));

	int x = 0;
	C[p] = 1;

	while ( p <= u && !viz[n] )
	{
		x = C[p++];

		for ( int i = 1; i <= a[x][0]; ++i )
			if ( !viz[b[x][i]] )
				if ( f[x][ b[x][i] ] < a[x][i] )
					viz[b[x][i]] = x, C[++u] = b[x][i];
	}

	return viz[n];
}

inline int min(int x, int y)
{
	return x < y ? x : y;
}

void flux()
{
	int L[maxn];

    while ( findway() )
	{
		int lg = 0;
		L[lg] = n;

		int p = maxm << 1;
		while ( L[lg] != 1 )
		{
			++lg;
			L[lg] = viz[ L[lg-1] ];

			int k = 1;
			while ( b[ L[lg] ][k] != L[lg - 1] )
                ++k;

            p = min(p, a[ L[lg] ][ k ] - f[ L[lg] ][ L[lg-1] ]);
		}

		for ( int i = lg; i; --i )
            f[ L[i] ][ L[i-1] ] += p, f[ L[i-1] ][ L[i] ] = -f[ L[i] ][ L[i-1] ];
	}
}

void BF(int s)
{
    int p = 0, u = 0;
    memset(viz, 0, sizeof(viz));

    int x = 0;
    viz[s] = 1;
    C[p] = s;
    crit[s] = s;

    while ( p <= u )
    {
        x = C[p++];

        for ( int i = 1; i <= a[x][0]; ++i )
            if ( !viz[ b[x][i] ] && f[ b[i][x] ][ b[x][i] ] < a[x][b[x][i]] && f[ b[x][i] ][ b[i][x] ] < a[b[x][i]][x] )
                viz[ b[x][i] ] = 1, crit[ b[x][i] ] = s, C[++u] = b[x][i];
    }
}

int main()
{
	read();
	flux();

    BF(1);
    BF(n);

    int cnt = 0;
    int answ[maxm];

//    for ( int i = 1; i <= n; ++i )
//    {
//        for ( int j = 1; j <= a[i][0]; ++j )
//            printf("%d ", b[i][j]);
//        printf("\n");
//    }
//    printf("\n");
    for ( int i = 0; i < m; ++i )
        if ( crit[ mc[i].x ] && crit[ mc[i].y ] && crit[ mc[i].x ] != crit[ mc[i].y ] )
            answ[cnt++] = i+1;
    #define fout out
    fprintf(fout, "%d\n", cnt);
    for ( int i = 0; i < cnt; ++i )
        fprintf(fout, "%d\n", answ[i]);

	return 0;
}

//#include <cstdio>
//#include <cstring>
//
//const int maxn = 1001;
//const int maxm = 10000;
//
//FILE *in = fopen("critice.in","r"), *out = fopen("critice.out","w");
//
//struct muchie
//{
//	short x, y;
//};
//
//int n, m;
//short a[maxn][maxn];
//short f[maxn][maxn];
//
//short viz[maxn];
//short C[maxn];
//
//muchie mc[maxm];
//short crit[maxn];
//
//
//void read()
//{
//	fscanf(in, "%d %d", &n, &m);
//
//	for ( int i = 0; i < m; ++i )
//	{
//		fscanf(in, "%hd %hd", &mc[i].x, &mc[i].y);
//		fscanf(in, "%hd\n", &a[ mc[i].x ][ mc[i].y ]);
//
//		a[ mc[i].y ][ mc[i].x ] = a[ mc[i].x ][ mc[i].y ];
//	}
//}
//
//int findway()
//{
//	int p = 0, u = 0;
//	memset(viz, 0, sizeof(viz));
//
//	int x = 0;
//	C[p] = 1;
//
//	while ( p <= u && !viz[n] )
//	{
//		x = C[p++];
//
//		for ( int i = 1; i <= n; ++i )
//			if ( !viz[i] )
//				if ( f[x][i] < a[x][i] )
//					viz[i] = x, C[++u] = i;
//	}
//
//	return viz[n];
//}
//
//inline int min(int x, int y)
//{
//	return x < y ? x : y;
//}
//
//void flux()
//{
//	int L[maxn];
//
//    while ( findway() )
//	{
//		int lg = 0;
//		L[lg] = n;
//
//		int p = maxm;
//		while ( L[lg] != 1 )
//		{
//			++lg;
//			L[lg] = viz[ L[lg-1] ];
//
//            p = min(p, a[ L[lg] ][ L[lg-1] ] - f[ L[lg] ][ L[lg-1] ]);
//		}
//
//		for ( int i = lg; i; --i )
//            f[ L[i] ][ L[i-1] ] += p, f[ L[i-1] ][ L[i] ] = -f[ L[i] ][ L[i-1] ];
//	}
//}
//
//void BF(int s)
//{
//    int p = 0, u = 0;
//    memset(viz, 0, sizeof(viz));
//
//    int x = 0;
//    viz[s] = 1;
//    C[p] = s;
//    crit[s] = s;
//
//    while ( p <= u )
//    {
//        x = C[p++];
//
//        for ( int i = 1; i <= n; ++i )
//            if ( !viz[i] && f[x][i] < a[x][i] && f[i][x] < a[i][x] )
//                viz[i] = 1, crit[i] = s, C[++u] = i;
//    }
//}
//
//int main()
//{
//	read();
//	flux();
//
//    BF(1);
//    BF(n);
//
//    int cnt = 0;
//    int answ[maxm];
//    for ( int i = 1; i <= n; ++i )
//    {
//        for ( int j = 1; j <= n; ++j )
//            fprintf(out,"%d ", f[i][j]);
//        fprintf(out,"\n");
//
//    }
//    for ( int i = 0; i < m; ++i )
//        if ( crit[ mc[i].x ] && crit[ mc[i].y ] && crit[ mc[i].x ] != crit[ mc[i].y ] )
//            answ[cnt++] = i+1;
//
//    fprintf(out, "%d\n", cnt);
//    for ( int i = 0; i < cnt; ++i )
//        fprintf(out, "%d\n", answ[i]);
//
//	return 0;
//}