二分圖多重匹配問題,用最大流解決。
建立二分圖,每個題為x集合中的頂點,每個類別為y集合中的頂點,增設附加源s和匯t。
1、從s向每個xi連線一條容量為1的有向邊。
2、從每個yi向t連線一條容量為該類別所需數量的有向邊。
3、如果乙個題i屬於乙個類別j,連線一條從xj到yi容量為1的有向邊。
求網路最大流,如果最大流量等於所有類別所需之和,則存在解,否則無解。對於每個類別,從x集合對應點出發的所有滿流邊,指向的b集合中的頂點就是該類別的所選的題(乙個可行解)。
二分圖多重匹配問題。x,y集合之間的邊容量全部是1,保證兩個點只能匹配一次,源匯的連邊限制了每個點匹配的個數。求出網路最大流,如果流量等於y集合所有點與t邊容量之和,那麼則說明y集合每個點都有完備的多重匹配。
#include using namespace std;
const int maxn = 3005;
const int maxm = 3005;
const int inf = 0x3f3f3f3f;
struct edge1
;struct dinic
edges.clear();
} void addedge(int from,int to,int cap)
); edges.push_back((edge1));
m = edges.size();
g[from].push_back(m - 2);
g[to].push_back(m - 1);
} bool bfs()
}} return vis[t];
} int dfs(int x,int a)
}return flow;
} int maxflow(int s,int t)
return flow;
}}din;
vectorans[maxn];
int main(void)
for(int i = 1; i <= n; i++)
}for(int i = 1; i <= n; i++)
if(sum == din.maxflow(s,t))
}for(int i = 1; i <= k; i++)
printf("\n");}}
else printf("no solution!\n");
return 0;
}
網路流24題 試題庫問題
網路流24題大多需要spj,所以需要乙個有spj的oj,本系列 均在www.oj.swust.edu.cn測試通過 這道題的模型很顯然,源點向每個試卷連線一條容量為1的邊,每個試卷向對應的型別連線一條容量為一的邊,每個型別向匯點連線一條容量為需要數量的邊,跑一邊最大流即可。include inclu...
網路流24題 試題庫問題
傳送門 這個題好像比較水。每個種類向匯點連容量為所需求的數量的邊 然後每個試題向可以選的種類連容量為1的邊 再從源點向每個試題連容量為1的邊,然後dinic 過程中記錄一下轉移的目標節點,然後輸出路徑就好了 判無解不用我說了吧。include include include include incl...
網路流24題 試題庫問題
有 k k 種型別和 n role presentation n n個題目,每個題目會適應部分型別,一種型別可能需要多種題,一道題可能多種型別都需要,但一道題只能滿足一種型別,現要求出滿足出完所有型別的題目的方案 網路流擅長於解決各種有要求的匹配,顯然這道題是有條件的匹配,可以用最大流來解決。首先建...