1. 程式人生 > >JDOJ-1833: Network of Schools 校園網

JDOJ-1833: Network of Schools 校園網

stat ble school pid 應該 true 分發 %d bsp

1833: Network of Schools 校園網

Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 155 Solved: 63
[Submit][Status][Web Board]

Description

一些學校連入一個電腦網絡。那些學校已訂立了協議:每個學校都會給其它的一些學校分發軟件(稱作“接受學校”)。註意如果 B 在 A 學校的分發列表中,那麽 A 不必也在 B 學校的列表中。

你要寫一個程序計算,根據協議,為了讓網絡中所有的學校都用上新軟件,必須接受新軟件副本的最少學校數目(子任務 A)。更進一步,我們想要確定通過給任意一個學校發送新軟件,這個軟件就會分發到網絡中的所有學校。為了完成這個任務,我們可能必須擴展接收學校列表,使其加入新成員。計算最少需要增加幾個擴展,使得不論我們給哪個學校發送新軟件,它都會到達其余所有的學校(子任務 B)。一個擴展就是在一個學校的接收學校列表中引入一個新成員。

Input

輸入文件的第一行包括一個整數 N:網絡中的學校數目(2 <= N <= 100)。學校用前 N 個正整數標識。接下來 N 行中每行都表示一個接收學校列表(分發列表)。第 i+1 行包括學校 i 的接收學校的標識符。每個列表用 0 結束。空列表只用一個 0 表示。

Output

你的程序應該在輸出文件中輸出兩行。第一行應該包括一個正整數:子任務 A 的解。第二行應該包括子任務 B 的解。

Sample Input

5 2 4 3 0 4 5 0 0 0 1 0

Sample Output

1 2

Source

USACO

總結:tarjan + 縮點
#include<bits/stdc++.h>

using namespace std;
const int maxn = 100005;

int dfn[maxn], low[maxn], n, tot = 0, tim;
bool vis[maxn]; stack<int> s; int c[maxn], r[maxn];
int head[maxn], cnt = 1, num, color[maxn];

struct Node{
    int v, nxt;
} G[maxn];
void insert(int
u, int v) { G[cnt] = (Node) {v, head[u]}; head[u] = cnt++; } void tarjan(int x) { vis[x] = true; s.push(x); low[x] = dfn[x] = ++tim; for (int i = head[x]; i; i = G[i].nxt) { int v = G[i].v; if(!dfn[v]) { tarjan(v); low[x] = min(low[x], low[v]); } else if(vis[v]) low[x] = min(low[x], dfn[v]); } if(dfn[x] == low[x]) { tot++; while(1) { int now = s.top(); s.pop(); vis[now] = false; color[now] = tot; if(now == x) break; } } } int main() { scanf("%d", &n); for (int i = 1; i <= n; ++i) { for(; ;) { int a; scanf("%d", &a); if(a == 0) break; insert(i, a); } } for (int i = 1; i <= n; ++i) if(!dfn[i]) tarjan(i); int ans1 = 0, ans2 = 0; for (int u = 1; u <= n; ++u) { for (int i = head[u]; i; i = G[i].nxt) { int v = G[i].v; if(color[u] != color[v]) { c[color[u]]++; r[color[v]]++; } } } for (int i = 1; i <= tot; ++i) { if(!c[i]) ans1++; if(!r[i]) ans2++; } printf("%d\n", ans2); if(tot == 1) printf("0\n"); else printf("%d\n", max(ans1, ans2)); return 0; }

JDOJ-1833: Network of Schools 校園網