loj 6002 網路流 24 題 最小路徑覆蓋

2021-08-14 20:55:59 字數 1600 閱讀 4230

(

題目描述

«問題描述:

每條邊的容量均為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 2

1 3

1 4

2 5

3 6

4 7

5 8

6 9

7 10

8 11

9 11

10 11

輸出樣例#1: 複製

1 4 7 10 11

2 5 8

3 6 9 3說明

1<=n<=150,1<=m<=6000

由@zhouyonglong提供spj

首先建圖 然後從源點向每個節點的入點都連權值為1的邊 從每個點的出點都向匯點連權值為1的邊 然後如果這兩點之間原來有邊那麼從起點的出點向終點的入點連1的邊 跑dinic完成最大匹配 那麼最後答案就是節點數-最大匹配數

我們考慮假如這兩個點可以匹配 那我是不是可以用一條路徑給覆蓋 初始我每個節點都需要路徑來覆蓋 現在有乙個匹配我就可以減少1 於是答案就是這樣

關於輸出路徑來說我應該尋找每個點 然後看他反向邊的殘餘流量如果是0 那麼那個點就在我的路徑上 可以畫圖感受一下 我比較傻給不出特別嚴謹的證明qwq

#include

#include

#include

#include

using

namespace

std;

#define inf 0x3f3f3f3f

#define n 400

inline

char gc()

return *s++;

}inline

int read()

return x;

}struct nodedata[15000];

int num=1,h[n],t,level[n],n,m;

bool visit[n];

inline

void insert1(int x,int y,int z)

inline

bool bfs()

}return0;}

inline

int dfs(int x,int s)

}return ss-s;

}int main()int ans=0;

while(bfs()) ans+=dfs(0,inf);

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

}while(flag);puts("");

}printf("%d",n-ans);

return

0;}

loj6004 網路流 24 題 圓桌聚餐

題目描述 假設有來自 n n n 個不同單位的代表參加一次國際會議。每個單位的代表數分別為 ri r i r i 會議餐廳共有 m m m 張餐桌,每張餐桌可容納 ci c i c i 個代表就餐。為了使代表們充分交流,希望從同乙個單位來的代表不在同乙個餐桌就餐。試設計乙個演算法,給出滿足要求的代表...

LOJ 6004 網路流 24 題 圓桌聚餐

題意 假設有來自 m mm 個不同單位的代表參加一次國際會議。每個單位的代表數分別為 r ir i ri 會議餐廳共有 n nn 張餐桌,每張餐桌可容納 c ic i ci 個代表就餐。為了使代表們充分交流,希望從同乙個單位來的代表不在同乙個餐桌就餐。試設計乙個演算法,給出滿足要求的代表就餐方案。連...

loj6013 網路流 24 題 負載平衡

題目描述 g 公司有 n n n 個沿鐵路運輸線環形排列的倉庫,每個倉庫儲存的貨物數量不等。如何用最少搬運量可以使 n n n 個倉庫的庫存數量相同。搬運貨物時,只能在相鄰的倉庫之間搬運。輸入格式 檔案的第 1 1 1 行中有 1 1 1 個正整數 n n n,表示有 n n n 個倉庫。第 2 2...