【題意】
n(2【題解】
找強連通分量,縮點。記f[i]為縮完點後的新圖中各點入度,g[i]為出度,ans1為f[i]==0的點的數目,ans2為g[i]==0的點的數目則第一問為ans1,第二問則為max。
至於第二問的解釋,我的想法是對於得到的dag圖,考慮其中的出度為0的點和入度為0的點組成的點集v,將這些點相連,最多這需要max條邊,就能使整個圖成為強連通分量。
但是請注意,大家可能都沒發現,這個結論的前提是dag圖是連通的情況下才成立。如果dag圖有多個連通分量,則還要考慮將多個連通分量合併的所需代價。幸運的是,這道題保證了只有乙個連通分量。(題目第一句話所說)
#include #include using namespace std;
const int maxn=105;
const int maxe=105*105;
struct edge
e[maxe];
int g[maxn],dfn[maxn],low[maxn],v[maxn],f[maxn],s[maxn],b[maxn],h[maxn];
int n,tot=0,cnt=0,ans=0,times=0,t=0,ans2;
void ins(int x,int y)
void tarjan(int x)
if (v[y]==1)
low[x]=min(low[x],dfn[y]);
}if (dfn[x]==low[x])
while (y!=x);
}}
int main()
}for (i=1;i<=n;i++)
if (v[i]==0)
tarjan(i);
if (cnt==1)
for (i=1;i<=tot;i++)
if (b[e[i].x]!=b[e[i].y])
ans=0;
for (i=1;i<=cnt;i++)
if (g[i]==0) ans++;
cout << ans << endl;
ans2=0;
for (i=1;i<=cnt;i++)
if (f[i]==0) ans2++;
cout << max(ans,ans2)<< endl;
}
poj 1236 強連通分量 縮點
有向無環圖中所有入度不為0的點,一定 可以由某個入度為0的點出發可達。假定有 n 個入度為0的點,m個出度為0的點,max m,n 就是第二個問題的解。include include include include include include include using namespace st...
poj1236 強連通分量 縮點
有一次比賽的時候遇到了一道強連通分量 縮點的題,過的人挺多,那個時候還沒有做過強連通的題,只能遺憾放棄。比賽回去,立馬整理了強連通縮點的模板,做了那道題。時隔多日,再找一道強連通的題,來聯絡一下 題目大意 有乙個有向圖,第一問 從幾個點開始走能夠全部遍歷一遍,第二問 如果要把整個有向圖變成強連通至少...
POJ 1236 強連通分量
題目鏈結 翻譯一下題目吧,大致含義就是,有n個學校,現在要向n個學校傳遞乙個軟體,如果a學校願意支援b學校,那麼給了a,a就會給b,但是a支援b但是b不一定支援a 有向圖警告 要求什麼呢,最少給多少個學校就可以給到全部的學校,最少加幾個支援關係,可以使得給任意乙個學校就可以傳遞到全部學校去。思路 第...