題意:有 n 座城市和 m 條有向邊,現在要把這 n 座城市分成一些洲,要求: 如果城市 u,v 之間可以互達則兩座城市要分在乙個洲裡面,
每個洲裡面的任意兩個城市 u,v之間至少需要存在一條邊,問做少能夠分成多少個洲。
先將可以互相到達的點縮點,然後要求用最小的邊將點連線,所以是最小路徑覆蓋問題。
#include#include#include#include#includeusing namespace std;
#define ll long long
#define me(a,b) memset(a,b,sizeof(a))
struct node
e[100005];
int dfn[5005],low[5005],head[5005],scnt[5005],head2[5005],book[5005],f[5005];
int tot,cnt,top,top2;
void add(int u,int v)
node e2[100005];
void add2(int u,int v)
stackq;
int n,m;
int trijan(int x)
else if(!scnt[u])low[x]=min(low[x],dfn[u]);
}if(low[x]==dfn[x])
}}int dfs(int x)}}
return 0;
}int main()
{ int t;
scanf("%d",&t);
while(t--)
{int n,m;
me(head,-1);
me(dfn,0);
me(low,0);
me(scnt,0);
cnt=tot=top=top2=0;
scanf("%d%d",&n,&m);
for(int i=0;i
最小路徑覆蓋問題(最小路徑覆蓋)
本題題目描述可以發現很明顯的最小路徑覆蓋問題,又因為最小路徑覆蓋 節點數 二分圖最大匹配數,所以本題可以用匈牙利演算法求出二分圖最大匹配數,也可以向第一題那樣用網路流模型求出最大匹配數。本題建模時不同在於,每個點要分成兩個點,乙個為起點,乙個為終點,再來求二分圖最大匹配。然後麻煩就在於本題也要輸出路...
hdu 3861 強量通分量 最小路徑覆蓋
有向圖中,路徑覆蓋就是在圖中找一些路徑,使之覆蓋了圖中的所有頂點,且任何乙個頂點有且只有一條路徑與之關聯 如果把這些路徑中的每條路徑從它的起始點走到它的終點,那麼恰好可以經過圖中的每個頂點一次且僅一次 如果不考慮圖中存在迴路,那麼每條路徑就是乙個弱連通子集 對於乙個路徑覆蓋,有如下性質 每個頂點屬於...
hdu1960 最小路徑覆蓋
題意 給你明天的計程車訂單,訂單中包含每個人的起點和終點座標,還有時間,如果一輛計程車想接乙個乘客必須在每個訂單前1分鐘到達,也就是小於等於time 1,問你完成所有訂單要最少多少量計程車.思路 典型的最小路徑覆蓋,對於最小路徑覆蓋,我們可以這麼理解,最次的情況是n輛,而只要找到那麼一組可以與其匹配...