poj1236
問,對於乙個dag(又向無環圖):
1.至少要選幾個點,才能從這些點出發到達所有點
2.至少加入幾條邊,就能從圖中任何乙個點出發到達所有點
先求dag的強連通分量數,再縮點,可以用tarjan演算法來做。
第乙個問題:不難想到答案就是縮點之後入度為0的點的個數
第二個問題:設縮點後入度為0的個數是n,出度為0的個數是m,至少新增邊的條數就是max(n,m)
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
const
int maxn=105;
int n;
int dfn[maxn];
int low[maxn];
int vis[maxn];
int belong[maxn];//belong[i]表示i屬於縮點後的哪個節點
int cnt;
int out[maxn];
int in[maxn];
int tot;
struct edge
edge[maxn*maxn];
int edgecount;
int head[maxn];
void init()
void add_edge(int u,int v)
stack
st;
void tarjan(int u)//從節點x開始搜尋
else
if(vis[v])//被訪問過,還在佇列裡
}if(low[u]==dfn[u])
}}void solve()
for(int u=1;u<=n;u++)}}
int ans1=0;
int ans2=0;
for(int i=1;i<=cnt;i++)
ans2=max(ans1,ans2);
if(cnt==1)printf("1\n0\n");
else
printf("%d\n%d\n",ans1,ans2);
}int main()
solve();
}return
0;}
poj1236 Tarjan演算法模板 詳解
思想 做一遍dfs,用dfn i 表示編號為i的節點在dfs過程中的訪問序號 也可以叫做開始時間 用low i 表示i節點dfs過程中i的下方節點所能到達的開始時間最早的節點的開始時間。初始時dfn i low i 在dfs過程中會形成一搜尋樹。在搜尋樹上越先遍歷到的節點,顯然dfn的值就越小。df...
POJ 1236 強連通分量
題目鏈結 翻譯一下題目吧,大致含義就是,有n個學校,現在要向n個學校傳遞乙個軟體,如果a學校願意支援b學校,那麼給了a,a就會給b,但是a支援b但是b不一定支援a 有向圖警告 要求什麼呢,最少給多少個學校就可以給到全部的學校,最少加幾個支援關係,可以使得給任意乙個學校就可以傳遞到全部學校去。思路 第...
poj 1236 強連通分量
題目大意 給定乙個n n 100 個點的有向圖,問 q1 最少需要選擇多少個點,使得從這些點出發能遍歷完整個圖 q2 最少需要新增多少條有向邊,使得整個圖成為強連通圖 分析 求出強連通分量後進行縮點,得到每個強連通分量的入度in,出度out q1 入度為0的強連通分量個數 q2 max 入度為0的強...