MATCHFIX 승부조작 런타임 에러 질문입니다..

  • highalps
    highalps
    #include <stdio.h>
    #include <vector>
    #include <queue>
    #include <memory.h>
    #define pb push_back
    using namespace std;
    
    
    int S, E, n, m;
    int win[15];
    int flow[200][200] = { 0 };
    int ary[200][200];
    int goal, res = 0;
    vector <vector <int> >vec;
    vector <int> parent;
    
    int netflow()
    {
    
        int a, b;
        queue <int> que;
        while (1)
        {
            vector <bool> chk(m + n + 5, false);
            que.push(S);
            while (!que.empty())
            {
                a = que.front(); que.pop();
                for (int i = 0; i<vec[a].size(); i++)
                {
                    b = vec[a][i];
                    if (!chk[b] && ary[a][b] - flow[a][b] > 0)
                    {
                        que.push(b);
                        chk[b] = true;
                        parent[b] = a;
                    }
                }
            }
            if (!chk[E])break;
            res++;
            for (int v = E; v != S; v = parent[v])
            {
                flow[parent[v]][v] += 1;
                flow[v][parent[v]] -= 1;
            }
        }
        return res;
    }
    
    bool isWin(int goal)
    {
        int max;
        for (int i = 1; i <= n; i++)
        {
            max = (i == 1 ? goal : goal - 1);
            ary[m + i][E] = max-win[i];
        }
        return netflow() == m; // goal로 모두 매칭이 가능한가?
    }
    int main()
    {
        int t, a, b;
        scanf("%d", &t);
        while (t--)
        {
            memset(flow, 0, sizeof(flow));
            goal = -1;
            res = 0;
            scanf("%d %d", &n, &m);
            vec.resize(m + n + 5);
            parent.resize(m + n + 5);
            S = 0, E = m + n + 1;
            for (int i = 1; i <= n; i++)
            {
                scanf("%d", &win[i]);
                if (goal == -1 || win[i] > goal)
                {
                    goal = win[i];
                    if (i != 1)goal++;
                }
                vec[m + i].pb(E);
            }
            for (int i = 1; i <= m; i++)
            {
                scanf("%d %d", &a, &b);
                vec[i].pb(m + a + 1); vec[i].pb(m + b + 1); //  경기->선수 A,B
                ary[i][m + a + 1] = 1; ary[i][m + b + 1] = 1; 
                vec[m + a + 1].pb(i); vec[m + b + 1].pb(i); // 선수A,B -> 경기
                vec[S].pb(i); // 소스->경기
                ary[S][i] = 1;
            }
            while (!isWin(goal))
            {
                goal++;
                if (goal > win[1] + m+1)break;
            }
    
            if (goal > win[1]+m || goal != flow[1+m][E]+win[1]  )
                printf("-1\n");
            else
            printf("%d\n", goal);
    
        }
        return 0;
    }
    

    소스는 S =0 싱크는 E = n+m+1 로 인덱싱해서
    goal을 1씩 증가시키면서 매칭이 되면서 0번 선수에게 그만큼 흘렀는지 체크해서 -1를 출력하느냐, goal을 출력하느냐 코드를 짰는데요

    테스트케이스는 나옵니다만.. 런타임 에러가 뜨는데
    원인을 모르겠습니다

    N은 최대 12이고 M은 최대 100이라

    배열 크기는 120씩 잡으면 충분한 것 같고
    이유를 모르겠습니다.

    *0번 선수를 0번이 아닌 1번부터 시작했습니다
    그래서 현재 승수win[1]... win[n]을 입력받았고
    flow[1+m][E] 는 0번 선수에서 싱크로 흐르는 유량을 뜻하게 됩니다

    다음은 에러 메시지입니다.

    RTE (SIGSEGV: segmentation fault, probably incorrect memory access or stack overflow)


    8년 전
0개의 댓글이 있습니다.
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.