MATCHFIX 승부조작 런타임 에러 질문입니다.. 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일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.
highalps
소스는 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년 전