QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#629094 | #4504. Book Club | jdelaure | RE | 0ms | 77892kb | C11 | 3.0kb | 2024-10-11 03:42:01 | 2024-10-11 03:42:03 |
Judging History
answer
#include <stdint.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
uint16_t graphAsArray[20002][20002];
//uint16_t graphAsGraph[20002][20002];
uint16_t graphNbEdges[20002];
uint16_t path[20002];
int nbPeople;
/*
void sanityCheck() {
for (int src = 0; src <= nbPeople*2+1; src++) {
for (int i = 0; i < graphNbEdges[src]; i++) {
int dst = graphAsArray[src][i];
if (!graphAsGraph[src][dst]) {
fprintf(stderr, "what the fuck %d %d\n", src, dst);
printf("[%i][%i]\n", src, i);
}
}
}
}
*/
uint16_t getEdgeIndex(uint16_t src, uint16_t dst) {
for (uint16_t i = 0; i < graphNbEdges[src]; i++) {
if (graphAsArray[src][i] == dst) {
return i;
}
}
return (uint16_t)-1;
}
void addEdge(uint16_t src, uint16_t dst) {
//if (!graphAsGraph[src][dst]) {
int index = graphNbEdges[src]++;
//graphAsGraph[src][dst] = index + 1;
graphAsArray[src][index] = dst;
//}
//sanityCheck();
}
void removeEdge(uint16_t src, uint16_t dst) {
int index, replace;
uint16_t newDst;
//if (graphAsGraph[src][dst]) {
replace = --graphNbEdges[src];
index = getEdgeIndex(src, dst); //graphAsGraph[src][dst] - 1;
newDst = graphAsArray[src][replace];
//graphAsGraph[src][dst] = 0;
graphAsArray[src][index] = newDst;
//graphAsGraph[src][newDst] = index + 1;
//}
//sanityCheck();
}
bool searchPath(uint16_t source, uint16_t target) {
if (source == target)
return true;
for (int i = 0; i < graphNbEdges[source]; i++) {
uint16_t dst = graphAsArray[source][i];
if (path[dst] == (uint16_t)-1) {
path[dst] = source;
if (searchPath(dst, target))
return true;
}
}
return false;
}
int fordFulkerson(uint16_t source, uint16_t target) {
uint16_t u, v;
int maxFlow = 0;
for (;;) {
memset(path, -1, sizeof(path));
if (!searchPath(source, target))
break;
//printf("%i %i\n", source, target);
v = target;
while (v != source) {
u = path[v];
removeEdge(u, v);
addEdge(v, u);
v = path[v];
}
maxFlow++;
}
return maxFlow;
}
int main(void) {
//freopen("J2.in", "r", stdin);
int nbDeclarations;
int person, preference;
scanf("%d %d", &nbPeople, &nbDeclarations);
for (int i = 0; i < nbDeclarations; i++) {
scanf("%d %d", &person, &preference);
addEdge(person*2, preference*2+1);
}
for (int i = 0; i < nbPeople; i++) {
addEdge(nbPeople*2, i*2);
addEdge(i*2+1, nbPeople*2+1);
}
int result = fordFulkerson(nbPeople*2, nbPeople*2+1);
if (result == nbPeople) {
printf("YES\n");
} else {
printf("NO\n");
}
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3656kb
input:
5 5 0 1 1 2 2 3 3 4 4 0
output:
YES
result:
ok single line: 'YES'
Test #2:
score: 0
Accepted
time: 0ms
memory: 77892kb
input:
1000 5000 0 271 0 320 0 325 0 378 0 562 0 942 0 957 1 88 1 235 1 271 1 579 1 604 1 751 1 875 1 929 2 70 2 403 2 470 2 909 2 912 3 352 3 657 3 810 4 201 4 361 4 414 4 418 4 505 4 531 4 597 4 833 5 14 5 123 5 281 5 878 5 938 6 311 6 392 6 564 6 994 7 246 7 353 7 372 7 710 7 751 7 772 8 149 8 435 8 682...
output:
NO
result:
ok single line: 'NO'
Test #3:
score: -100
Runtime Error
input:
10000 10000 0 3378 1 8751 2 9999 3 7769 4 6001 5 9998 6 9311 7 9996 8 7722 9 1572 10 9994 11 3865 12 186 13 7614 14 9992 15 9991 16 4424 17 9807 18 5031 19 7909 20 4994 21 292 22 9990 23 8180 24 5837 25 9989 26 9554 27 7552 28 8027 29 5135 30 9988 31 4067 32 702 33 9984 34 8831 35 6971 36 7354 37 81...