某近似於模板題2

2022-04-29 03:18:11 字數 2578 閱讀 4440

p2812 校園網路

題目背景

浙江省的幾所oi強校的神犇發明了一種人工智慧,可以ac任何題目,所以他們決定建立乙個網路來共享這個軟體。但是由於他們腦力勞動過多導致全身無力身體被♂掏♂空,他們來找你幫助他們。

題目描述

共有n所學校(n<=10000)已知他們實現設計好的網路共m條線路,為了保證高速,網路是單向的。現在請你告訴他們至少選幾所學校作為共享軟體的母機母雞,能使每所學校都可以用上。再告訴他們至少要新增幾條線路能使任意一所學校作為母機母雞都可以使別的學校使用上軟體。

輸入輸出格式

輸入格式:

第一行乙個整數n。

接下來n行每行有若干個整數,用空格空格隔開。

第i-1行的非零整數x,表示從i到x有一條線路。以0作為結束標誌。

輸出格式:

第一行乙個整數表示問題1的答案。

第二行回答問題2.

輸入輸出樣例

輸入樣例#1: 複製

52 0

4 05 0

1 00

輸出樣例#1: 複製22

說明poj原題。資料擴大了100倍。

其實這是兩個題

p2746 [usaco5.3]校園網network of schools

題目描述

一些學校連入乙個電腦網路。那些學校已訂立了協議:每個學校都會給其它的一些學校分發軟體(稱作「接受學校」)。注意即使 b 在 a 學校的分發列表中, a 也不一定在 b 學校的列表中。

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

輸入輸出格式

輸入格式:

輸入檔案的第一行包括乙個整數 n:網路中的學校數目(2 <= n <= 100)。學校用前 n 個正整數標識。

接下來 n 行中每行都表示乙個接收學校列表(分發列表)。第 i+1 行包括學校 i 的接收學校的識別符號。每個列表用 0 結束。空列表只用乙個 0 表示。

輸出格式:

你的程式應該在輸出檔案中輸出兩行。

第一行應該包括乙個正整數:子任務 a 的解。

第二行應該包括子任務 b 的解。

輸入輸出樣例

輸入樣例#1: 複製

52 4 3 0

4 5 000

1 0輸出樣例#1: 複製12

說明題目翻譯來自nocow。

usaco training section 5.3

這兩個題資料乙個賽乙個水

我這個應該是非正解(錯誤解法)

但是第二個題得了九十分

第乙個題得了100分

還說在poj的基礎上資料擴大了100倍

怎麼還是這麼水

#include#include#include#define n 10005

using namespace std;

struct edgee[n];

int head[n],tot;

int top;

int col[n];

int n,m,ans;

int vis[n],sta[n];

int dfn[n],low[n];

int col_num,dfn_num;

void addedge(int a,int b)

void tarjan(int x)

else if(vis[to])

low[x]=min(low[x],dfn[to]);

}if(dfn[x]==low[x])

top--;

}}int to;

int ru[n];

int chu[n];

int main()

}int a,b;a=b=0;

for(int i=1;i<=n;++i)

if(!dfn[i])

tarjan(i);

for(int i=1;i<=n;++i)

for(int j=head[i];j;j=e[j].nxt)

}for(int i=1;i<=col_num;++i)

if(col_num==1)b=0;

printf("%d\n%d\n",a,b);

}return 0;

}

看了題解才知道我距離正解只有一步之遙

還是太年輕,考慮問題不夠全面

tarjan縮點 對縮點後新圖掃每個強連通塊的入度出度

對於子任務a 求需要給多少個學校發軟體 即為求有多少個入度為0的點 因為對於對於每個入度不為0的點一定可以從乙個其他點走到

對於子任務b 求入度為0的點個數與出度為0的點個數的最大值 需要添多少條邊才能形成使所有點都可以被某個點到達 所以對於每個出度為0的點 需要拓展一條出邊 對於每個入度為0的點 需要拓展一條入邊 為了減少拓展邊數 可以將所有出度為0的點拓展出邊到某個入度為0的點的上 最後答案即為 max(入度為0點數,出度為0點數)

某近似模板題2

p3388 模板 割點 割頂 題目背景 割點題目描述 給出乙個n個點,m條邊的無向圖,求圖的割點。輸入輸出格式 輸入格式 第一行輸入n,m 下面m行每行輸入x,y表示x到y有一條邊 輸出格式 第一行輸出割點個數 第二行按照節點編號從小到大輸出節點,用空格隔開 輸入輸出樣例 輸入樣例 1 複製 6 7...

LCT模板題2 最長鏈

樹是任意兩點間僅有一條路徑的聯通圖,樹上的一條鏈定義為兩個點之間的路徑。在本題中定義一條鏈的長度為鏈上所有點的權值和。現有一棵帶點權樹,要對它進行一些操作,請你在第一次操作前和每一次操作後輸出這棵樹的最長鏈。lct splay的時候判gf 是 isroot f 下次注意 這題非常不錯的虛邊維護兒子資...

最小生成樹2道模板題

poj2485 題目大意 有幾個小島,現要修路將其連線起來,求最長路的最小值。題目分析 求生成樹的最大邊最小值。其實也是最小生成樹的最大邊,可用kruskal每次將最小邊加進來,最後一條邊就是最大邊 include include includeusing namespace std int a 5...