結果
問題 | No.1776 Love Triangle 2 (Hard) |
ユーザー |
👑 |
提出日時 | 2021-11-19 18:49:53 |
言語 | C (gcc 13.3.0) |
結果 |
TLE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 3,813 bytes |
コンパイル時間 | 992 ms |
コンパイル使用メモリ | 33,280 KB |
実行使用メモリ | 8,736 KB |
最終ジャッジ日時 | 2024-07-02 11:59:46 |
合計ジャッジ時間 | 13,903 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 4 TLE * 1 -- * 171 |
ソースコード
#include <stdio.h>#define N_MAX 150#define M_MAX 12000typedef struct Edge {struct Edge *next;int v;unsigned int label;} edge;void chmin(int* a, int b){if (*a > b) *a = b;}int lex_smaller(int a[], int b[]){int i;for (i = 0; i <= a[0]; i++) {if (a[i] < b[i]) return 1;else if (a[i] > b[i]) return -1;}return 0;}void chlexmin(int a[], int b[]){int i;if (lex_smaller(a, b) < 0) for (i = 0; i <= b[0]; i++) a[i] = b[i];}void print_ans(int N, int ans[]){int i;if (ans[0] > N) {printf("-1\n");return;} else printf("%d\n", ans[0]);for (i = 1; i <= ans[0]; i++) printf("%d ", ans[i]);printf("%d\n", ans[1]);}void DFS_naive_lexmin(edge* adj[], int X, int Y, int Z, int u, int flag[], int tmp[], int ans[]){int i;if (flag[u] != 0) {if (u == X && flag[Y] != 0 && flag[Z] != 0) for (i = 0; i <= tmp[0]; i++) ans[i] = tmp[i];return;} else flag[u] = 1;edge *p;tmp[++tmp[0]] = u;if (lex_smaller(tmp, ans) > 0) for (p = adj[u]; p != NULL; p = p->next) DFS_naive_lexmin(adj, X, Y, Z, p->v, flag, tmp, ans);tmp[0]--;flag[u] = 0;}// Naive solution for finding the lexmin solutionint naive_lexmin(int N, int M, int X, int Y, int Z, int A[], int B[], int ans[]){static int i, u, w, adj_mat[N_MAX + 1][N_MAX + 1];static edge *adj[N_MAX + 1], e[M_MAX * 2], *p;for (u = 1; u <= N; u++) for (w = u + 1; w <= N; w++) adj_mat[u][w] = 0;for (i = 1; i <= M; i++) {u = A[i];w = B[i];adj_mat[u][w] = 1;}for (u = 1; u <= N; u++) adj[u] = NULL;for (u = 1, i = 0; u <= N; u++) {for (w = N; w > u; w--) {if (adj_mat[u][w] != 0) continue;e[i].v = w;e[i].next = adj[u];adj[u] = &(e[i++]);}for (w = u - 1; w >= 1; w--) {if (adj_mat[w][u] != 0) continue;e[i].v = w;e[i].next = adj[u];adj[u] = &(e[i++]);}}static int tmp[N_MAX + 1], flag[N_MAX + 1] = {}, q[N_MAX + 1], head, tail;// Y--Z path?flag[X] = 1;flag[Y] = 1;q[0] = X;q[1] = Y;for (head = 1, tail = 2; head < tail; head++) {u = q[head];for (p = adj[u]; p != NULL; p = p->next) {w = p->v;if (flag[w] == 0) {flag[w] = 1;q[tail++] = w;}}}if (flag[Z] == 0) {for (head = 0; head < tail; head++) flag[q[head]] = 0;ans[0] = N + 1;for (i = 1; i <= N + 1; i++) ans[i] = 0;return -1;} else for (head = 0; head < tail; head++) flag[q[head]] = 0;// Z--X path?flag[Y] = 1;flag[Z] = 1;q[0] = Y;q[1] = Z;for (head = 1, tail = 2; head < tail; head++) {u = q[head];for (p = adj[u]; p != NULL; p = p->next) {w = p->v;if (flag[w] == 0) {flag[w] = 1;q[tail++] = w;}}}if (flag[X] == 0) {for (head = 0; head < tail; head++) flag[q[head]] = 0;ans[0] = N + 1;for (i = 1; i <= N + 1; i++) ans[i] = 0;return -1;} else for (head = 0; head < tail; head++) flag[q[head]] = 0;// X--Y path?flag[Z] = 1;flag[X] = 1;q[0] = Z;q[1] = X;for (head = 1, tail = 2; head < tail; head++) {u = q[head];for (p = adj[u]; p != NULL; p = p->next) {w = p->v;if (flag[w] == 0) {flag[w] = 1;q[tail++] = w;}}}if (flag[Y] == 0) {for (head = 0; head < tail; head++) flag[q[head]] = 0;ans[0] = N + 1;for (i = 1; i <= N + 1; i++) ans[i] = 0;return -1;} else for (head = 0; head < tail; head++) flag[q[head]] = 0;// DFStmp[0] = 0;ans[0] = N + 1;for (i = 1; i <= N + 1; i++) ans[i] = 0;DFS_naive_lexmin(adj, X, Y, Z, X, flag, tmp, ans);if (ans[0] > N) return -1;else return ans[0];}int main(){int i, N, M, X, Y, Z, A[M_MAX + 1], B[M_MAX + 1], ans[N_MAX + 2];scanf("%d %d", &N, &M);scanf("%d %d %d", &X, &Y, &Z);for (i = 1; i <= M; i++) scanf("%d %d", &(A[i]), &(B[i]));naive_lexmin(N, M, X, Y, Z, A, B, ans);print_ans(N, ans);fflush(stdout);return 0;}