【BZOJ】3296: [USACO2011 Open] Learning Languages(tarjan)
3633 단어 language
분명히 모든 군 이 교류 할 수 있 는 군 은 강력 한 연결 블록 이다.
그리고 scc 의 수량 을 구하 면 정 답 은 scc - 1 입 니 다.
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << #x << " = " << x << endl
#define printarr2(a, b, c) for1(i, 1, b) { for1(j, 1, c) cout << a[i][j]; cout << endl; }
#define printarr1(a, b) for1(i, 1, b) cout << a[i]; cout << endl
inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
inline const int max(const int &a, const int &b) { return a>b?a:b; }
inline const int min(const int &a, const int &b) { return a<b?a:b; }
const int N=50005;
int n, m, ihead[N], cnt, FF[N], LL[N], tot, q[N], top, vis[N], scc;
struct ED { int to, next; }e[N*10];
void add(int u, int v) {
e[++cnt].next=ihead[u]; ihead[u]=cnt; e[cnt].to=v;
e[++cnt].next=ihead[v]; ihead[v]=cnt; e[cnt].to=u;
}
void tarjan(int x) {
vis[x]=1; FF[x]=LL[x]=++tot;
q[++top]=x;
int v;
for(int i=ihead[x]; i; i=e[i].next) {
v=e[i].to;
if(!FF[v]) tarjan(v), LL[x]=min(LL[x], LL[v]);
else if(vis[v]) LL[x]=min(LL[x], FF[v]);
}
if(FF[x]==LL[x]) {
++scc;
do {
v=q[top--];
vis[v]=0;
}while(v!=x);
}
}
int main() {
read(n); read(m);
for1(i, 1, n) {
int t=getint();
while(t--) {
int v=getint();
add(i, n+v);
}
}
for1(i, 1, n) if(!FF[i]) tarjan(i);
print(scc-1);
return 0;
}
Description
농부 존의 N (2 < = N < = 10, 000) 마리 젖소, 번 호 는 1. N 으로 모두 M (1 < = M < = 30, 000) 가지 언어 를 유창 하 게 사용 하고 번 호 는 1. M., i 머리 에서 K 를 말 할 줄 안다.i (1 < = K i < = M) 종 언어, 즉 Li1, L_i2,..., L_{iK_i} (1 <= L_ij <= M)。 FJ 젖소 가 똑똑 하지 않 아서 Ki 의 총 화 는 많아야 100, 000 이다.소 두 마 리 는 어떤 언어 를 할 줄 알 지 않 는 한 직접 교류 할 수 없다.그러나 공통어 가 없 는 젖소 들 은 다른 소 들 에 게 통역 을 시 킬 수 있다.다시 말 하면 소 A 와 B 는 대 화 를 할 수 있 고 하나의 서열 의 젖소 T 만 존재 한다.1,T_2,...,T_k, A 와 T1. 어떤 언어 를 할 줄 알 아 요. T1 과 T2. 어떤 언어 도 할 줄 알 아 요.......................................................k 와 B 는 어떤 언어 를 할 줄 안다.농부 존 은 그의 젖소 가 더욱 단결 하 기 를 희망 하기 때문에, 그 는 임의의 두 마리 의 소 사이 에서 교류 할 수 있 기 를 희망 한다.그 는 책 을 사서 그의 젖소 에 게 어떤 언어 도 가 르 칠 수 있다.FJ 는 상당히 검소 한 농민 으로서 최소한 의 책 을 사서 모든 젖소 가 서로 말 을 할 수 있 도록 하려 고 한다.그 가 확정 하도록 돕다. *그 가 구 매해 야 할 책의 최저 수량
Input
* 첫 번 째 줄: 두 개의 빈 칸 으로 구 분 된 정수: N 과 M * 두 번 째 줄: N + 1 줄: i + 1 줄 이 묘사 한 우 i 의 언어, Ki + 1 개의 빈 칸 으로 구 분 된 정수: Ki L_i1 L_i2,...,L_I{K_i}。
Output
* 첫 번 째 줄: 하나의 정수, FJ 가 최소한 구 매해 야 할 책의 개수.
Sample Input
3 3
2 3 2
1 2
1 1
Sample Output
1
HINT
3 번 소 에 게 두 번 째 책 을 사주 면 됩 니 다.
Source
Silver
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
터무니없는 최적화 이야기일단 지루해서 내 소프트웨어를 프로파일링하기로 결정했습니다. 이라는 취미 언어용 컴파일러입니다. 부스트래핑하면서 얻은 프로파일러 데이터에서 비용이 일정하지 않은 함수를 발견했습니다. 기능은 우리는 컴파일러에 있습니다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.