Cod sursa(job #798113)

Utilizator Sm3USmeu Rares Sm3U Data 15 octombrie 2012 19:21:46
Problema Parcurgere DFS - componente conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.63 kb
#include <cstdio>
#define nMax 1010
#define max(a,b) ((a>b)?a:b)

using namespace std;

int a[nMax][nMax];
int viz[nMax];
int parcurgere[nMax];
int nParcurgere;
int n;
int m;
int M;
int ptViz;

void dfsInceput(int i)
{
    viz[i] = 1;
    for(int j = 1; j <= n; ++ j){
        if(a[i][j] && !viz[j]){
            parcurgere[nParcurgere ++] = j;
            dfsInceput(j);
        }
    }
}

void citire()
{
    scanf ("%d", &n);
    scanf ("%d", &m);
    for (int i = 0; i < m; ++ i) {
        int x;
        int y;
        scanf ("%d%d", &x, &y);
        a[x][y] = 1;
        a[y][x] = 1;
    }
    parcurgere[nParcurgere ++] = 1;
    dfsInceput(1);
}

/*void dfs(int i)
{
    viz[i] = ptViz;
    for (int j = 1; j <= n; ++ j){
        if (a[i][j] && viz[j] != ptViz){
            if (parcurgere[nParcurgere] != j){
                throw 0;
            }
            nParcurgere++;
            dfs(j);
        }
    }
}*/

void dfs2(int i)
{
    viz[i] = 1;
    for (int j = 1 ; j <= n; ++ j){
        if (a[i][j] && !viz[j]){
            if ( parcurgere[nParcurgere] != j){
                a[i][j] = a[j][i] = 0;
                continue;
            }
            nParcurgere ++;
            dfs2(j);
        }
    }
}

void rez2()
{
    for (int i = 1; i <= n; ++ i){
        for(int j = 1; j <= n; ++ j){
            a[i][j] = 1;
        }
        viz[i] = 0;
    }
    nParcurgere = 1;
    dfs2(1);
    for (int i = 1; i <= n; ++ i){
        for(int j = 1; j <i; ++ j){
            if (a[i][j] == 1){
                M ++;
            }
        }
        for(int j = i + 1; j <= n; ++ j){
            if (a[i][j] == 1){
                M ++;
            }
        }
    }
    M -= m * 2;
    M /= 2;


}

/*void rez()
{
    ptViz = 1;
    for (int i = 1; i <= n; ++ i){
        for (int j = i + 1; j <= n; ++ j){
            if(a[i][j] == 0){
                a[i][j] = 1;
                a[j][i] = 1;
                try{
                    nParcurgere = 1;
                    ptViz ++;
                    dfs(1);
                    throw 1;
                }
                catch (int ok){
                    if(ok == 0){
                        a[i][j] = 0;
                        a[j][i] = 0;
                    }else{
                        M += 1;
                       // printf("%d %d\n",i,j);
                    }
                }
            }
        }
    }
}
*/
int main()
{
    freopen ("dfs.in", "r", stdin);
    freopen ("dfs.out", "w", stdout);
    citire();
   // rez();
    rez2();
    printf ("%d\n", M );

    return 0;
}