Submission #73370522


Source Code Expand

Copy
#include <stdio.h>
#include <stdlib.h>
int n, m;
int a[114514], b[114514];
int ec[114514], *es[114514];
int rec[114514], *res[114514];
void ae(int f, int t) {
es[f] = realloc(es[f], sizeof(*es[f]) * (ec[f] + 1));
if (es[f] == NULL) exit(2);
es[f][ec[f]++] = t;
res[t] = realloc(res[t], sizeof(*res[t]) * (rec[t] + 1));
if (res[t] == NULL) exit(2);
res[t][rec[t]++] = f;
}
char visited1[114514];
int order_cnt = 0;
int order[114514];
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#include <stdio.h>
#include <stdlib.h>

int n, m;
int a[114514], b[114514];

int ec[114514], *es[114514];
int rec[114514], *res[114514];

void ae(int f, int t) {
	es[f] = realloc(es[f], sizeof(*es[f]) * (ec[f] + 1));
	if (es[f] == NULL) exit(2);
	es[f][ec[f]++] = t;
	res[t] = realloc(res[t], sizeof(*res[t]) * (rec[t] + 1));
	if (res[t] == NULL) exit(2);
	res[t][rec[t]++] = f;
}

char visited1[114514];
int order_cnt = 0;
int order[114514];

void ksb1(int node) {
	int i;
	if (visited1[node]) return;
	visited1[node] = 1;
	for (i = 0; i < ec[node]; i++) {
		ksb1(es[node][i]);
	}
	order[order_cnt++] = node;
}

int ksid = 0;
int ks[114514];

void ksb2(int node) {
	int i;
	if (ks[node]) return;
	ks[node] = ksid;
	for (i = 0; i < rec[node]; i++) {
		ksb2(res[node][i]);
	}
}

int incnt[114514];

int main(void) {
	int i;
	int ans = 0;
	if (scanf("%d%d", &n, &m) != 2) return 1;
	for (i = 0; i < m; i++) {
		if (scanf("%d%d", &a[i], &b[i]) != 2) return 1;
		ae(a[i], b[i]);
	}
	for (i = 1; i <= n; i++) {
		ksb1(i);
	}
	for (i = n - 1; i >= 0; i--) {
		if (ks[order[i]] == 0) {
			ksid++;
			ksb2(order[i]);
		}
	}
	for (i = 0; i < m; i++) {
		if (ks[a[i]] != ks[b[i]]) incnt[ks[b[i]]]++;
	}
	for (i = 1; i <= ksid; i++) {
		if (incnt[i] == 0) ans++;
	}
	printf("%d\n", ans);
	return 0;
}

/*

強連結成分分解して、入次数0の頂点を、かつそれのみを選ぶ

強連結成分分解の意味とアルゴリズム | 高校数学の美しい物語
https://manabitimes.jp/math/1250

*/

Submission Info

Submission Time
Task advertisement - 宣伝 (Advertisement)
User mikecat
Language C23 (GCC 14.2.0)
Score 100
Code Size 1582 Byte
Status AC
Exec Time 20 ms
Memory 10076 KiB

Judge Result

Set Name Set01 Set02 Set03 Set04 Set05 Set06 Set07 Set08 Set09 Set10
Score / Max Score 10 / 10 10 / 10 10 / 10 10 / 10 10 / 10 10 / 10 10 / 10 10 / 10 10 / 10 10 / 10
Status
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
Set Name Test Cases
Set01 01
Set02 02
Set03 03
Set04 04
Set05 05
Set06 06
Set07 07
Set08 08
Set09 09
Set10 10
Case Name Status Exec Time Memory
01 AC 0 ms 1872 KiB
02 AC 0 ms 1724 KiB
03 AC 0 ms 1844 KiB
04 AC 0 ms 1872 KiB
05 AC 0 ms 1760 KiB
06 AC 0 ms 1732 KiB
07 AC 0 ms 1684 KiB
08 AC 6 ms 3336 KiB
09 AC 19 ms 6880 KiB
10 AC 20 ms 10076 KiB


2026-02-16 (Mon)
21:20:21 +09:00