«問題描述:
每條邊的容量均為1。求網路g1的( 0 x , 0 y )最大流。
«程式設計任務:
對於給定的給定有向無環圖g,程式設計找出g的乙個最小路徑覆蓋。
輸入格式:
件第1 行有2個正整數n和m。n是給定有向無環圖g 的頂點數,m是g 的邊數。接下來的m行,每行有2 個正整數i和j,表示一條有向邊(i,j)。
輸出格式:
從第1 行開始,每行輸出一條路徑。檔案的最後一行是最少路徑數。
輸入樣例#1:複製
11 12輸出樣例#1:複製1 21 3
1 42 5
3 64 7
5 86 9
7 10
8 11
9 11
10 11
1 4 7 10 111<=n<=150,1<=m<=60002 5 8
3 6 9
3
對於乙個路徑覆蓋,有如下概念:
①:每個頂點只屬於乙個路徑;
②:路徑上除終點外,從每個頂點出發只有一條邊指向路徑上的另一頂點。
將所有點拆成功入點和出點,源點連所有入點,匯點連所有出點,所有邊容量都為1,而對於每個邊u-v來說,只連
u的入點和v的出點,這樣保證了每個點至少會走一次。最後還原路徑,對於每個起點,每次走與他相連且殘留量為0
的點並標記。
最小路徑覆蓋數=頂點數-二分最大匹配數
#pragma gcc optimize(2)
#include#include#include#includeusing namespace std;
const int maxn = 1e5;
const int inf = 0x3f3f3f3f;
typedef long long ll;
int head[maxn], level[maxn];
int n, m, tot;
struct node
edge[maxn];
void addedge(int u, int v, int w)
bool bfs(int s, int t)
} }return level[t] != 0;
}int dfs(int s, int t, int f)
int cost = 0;
for (int i = head[s]; i != -1; i = edge[i].next)
}else
}} return cost;
}int dinic(int s, int t)
return flow;
}int main()
for (int i = 1; i <= n; i++)
int sum = n - dinic(s, t);
int vis[maxn];
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= n; i++)
int flag = 0, now = i;
while (1)
}if (!flag)
}printf("\n");
} printf("%d\n", sum);
} return 0;
}
網路流24題 最小路徑覆蓋 (最小路徑覆蓋)
題目 給定有向圖g v,e 設p是g的乙個簡單路 頂點不相交 的集合。如果v中每個頂點恰好在p的一條路上,則稱p是g的乙個路徑覆蓋。p中路徑可以從v的任何乙個頂點開始,長度也是任意的,特別地,可以為0。g的最小路徑覆蓋是g的所含路徑條數最少的路徑覆蓋。設計乙個有效演算法求乙個有向無環圖g的最小路徑覆...
網路流24題 最小路徑覆蓋問題
有向無環圖最小路徑覆蓋,可以轉化成二分圖最大匹配問題,從而用最大流解決。構造二分圖,把原圖每個頂點i拆分成二分圖x,y集合中的兩個頂點xi和yi。對於原圖中存在的每條邊 i,j 在二分圖中連線邊 xi,yj 然後把二分圖最大匹配模型轉化為網路流模型,求網路最大流。最小路徑覆蓋的條數,就是原圖頂點數,...
最小路徑覆蓋問題(網路流24題)
問題描述 給定有向圖g v,e 設p 是g 的乙個簡單路 頂點不相交 的集合。如果v 中每個頂點恰好在p 的一條路上,則稱p是g 的乙個路徑覆蓋。p 中路徑可以從v 的任何乙個頂點開始,長度也是任意的,特別地,可以為0。g 的最小路徑覆蓋是g 的所含路徑條數最少的路徑覆蓋。設計乙個有效演算法求乙個有...