標籤:它的 href file 時間 cst 電腦 oid can str
http://www.cogs.pro/cogs/problem/problem.php?pid=908 || https://www.luogu.org/problem/show?pid=2746
★★ 輸入檔案:schlnet.in
輸出檔案:schlnet.out
簡單對比
時間限制:1 s 記憶體限制:128 MB
USACO/schlnet(譯 by Felicia Crazy)
描述
一些學校連入一個電腦網路。那些學校已訂立了協議:每個學校都會給其它的一些學校分發軟體(稱作“接受學校”)。注意如果 B 在 A 學校的分發列表中,那麼 A 不必也在 B 學校的列表中。
你要寫一個程式計算,根據協議,為了讓網路中所有的學校都用上新軟體,必須接受新軟體副本的最少學校數目(子任務 A)。更進一步,我們想要確定通過給任意一個學校發送新軟體,這個軟體就會分發到網路中的所有學校。為了完成這個任務,我們可能必須擴充接收學校列表,使其加入新成員。計算最少需要增加幾個擴充,使得不論我們給哪個學校發送新軟體,它都會到達其餘所有的學校(子任務 B)。一個擴充就是在一個學校的接收學校列表中引入一個新成員。
PROGRAM NAME: schlnetINPUT FORMAT (file schlnet.in)
輸入檔案的第一行包括一個整數 N:網路中的學校數目(2 <= N <= 100)。學校用前 N 個正整數標識。接下來 N 行中每行都表示一個接收學校列表(分發列表)。第 i+1 行包括學校 i 的接收學校的標識符。每個列表用 0 結束。空列表只用一個 0 表示。
OUTPUT FORMAT(file schlnet.out)
你的程式應該在輸出檔案中輸出兩行。第一行應該包括一個正整數:子任務 A 的解。第二行應該包括子任務 B 的解。
SAMPLE INPUT (file schlnet.in)
5
2 4 3 0
4 5 0
0
0
1 0
SAMPLE OUTPUT (file schlnet.out)
1
2
A: 縮點後入度為零的點;B:縮點後出度為零的點和(縮點後的點數-入讀為零的點的個數)取MAX
特判只有一個連通塊的的時候
1 #include <algorithm> 2 #include <cstdio> 3 4 using namespace std; 5 6 const int N(110*110); 7 int n,ans_a,ans_b,cnt; 8 9 int head[N],sumedge;10 struct Edge11 {12 int v,next;13 Edge(int v=0,int next=0): v(v),next(next){}14 }edge[N];15 void ins(int u,int v)16 {17 edge[++sumedge]=Edge(v,head[u]);18 head[u]=sumedge;19 }20 21 int tim,dfn[N],low[N];22 int top,Stack[N],instack[N];23 int sumcol,col[N],rd[N],cd[N],point[N];24 void DFS(int now)25 {26 dfn[now]=low[now]=++tim;27 Stack[++top]=now; instack[now]=1;28 for(int i=head[now];i;i=edge[i].next)29 {30 int v=edge[i].v;31 if(!dfn[v]) DFS(v),low[now]=min(low[now],low[v]);32 else if(instack[v]) low[now]=min(low[now],dfn[v]);33 }34 if(low[now]==dfn[now])35 {36 col[now]=++sumcol;37 point[sumcol]++;38 for(;Stack[top]!=now;top--)39 {40 col[Stack[top]]=sumcol;41 point[sumcol]++;42 instack[Stack[top]]=0;43 }44 instack[now]=0; top--;45 }46 }47 48 int main()49 {50 // freopen("schlnet.in","r",stdin);51 // freopen("schlnet.out","w",stdout);52 scanf("%d",&n);53 for(int u=1;u<=n;u++)54 for(int v;scanf("%d",&v)&&v;) ins(u,v);55 for(int i=1;i<=n;i++)56 if(!dfn[i]) DFS(i);57 for(int u=1;u<=n;u++)58 {59 for(int i=head[u];i;i=edge[i].next)60 {61 int v=edge[i].v;62 if(col[u]==col[v]) continue;63 if(!rd[col[v]]) cnt++;64 cd[col[u]]++; rd[col[v]]++;65 }66 } 67 for(int i=1;i<=sumcol;i++)68 {69 if(!rd[i]) ans_a++;70 if(!cd[i]) ans_b++;71 } ans_b=max(ans_b,sumcol-cnt);72 if(sumcol==1) ans_b=0;73 printf("%d\n%d",ans_a,ans_b);74 return 0;75 }
COGS——C 908. 校園網 || 洛穀——P 2746 [USACO5.3]校園網Network of Schools