poj1087解題報告(最大流 EK演算法)

2021-07-03 18:33:31 字數 1406 閱讀 2963

題目大意:題意:有n個不同的插座,有m臺不同的機器需要m種插頭,有k組轉換:插頭a能由插頭b轉換而來。問這些機器最少有幾台不能插上插座。

解題思路:使用網路流,以裝置的插頭型別和插座的插頭型別組成乙個圖,建立超級源點,超級匯點,源點到裝置的流量為1,插座到匯點的流量為1,裝置和流量之間流量為無限大(可以任取),最後用裝置數減去最大流量。(利用floyd演算法進行閉包傳遞,根據轉化器的關係)

#include#include#include#include#include#include#includeusing namespace std;

const int maxn=400+10;

vectornames;

int id(const string &s)

void addedge(int from, int to, int cap)

int maxflow(int s, int t)

}if(a[t]) break;

}if(!a[t]) break;

for(int u = t; u != s; u = edges[p[u]].from)

flow += a[t];

}return flow;

}};edmondskarp g;

int n, m, k; // 插座個數,裝置個數,轉換器個數

int d[maxn][maxn]; // d[i][j]=1表示插頭型別i可以轉化為插頭型別j

int target[maxn]; // 各個插座的型別

int device[maxn]; // 各個裝置的型別

int main()

scanf("%d",&m);

for(int i=0;i>s1>>s2;

device[i]=id(s2);

}memset(d, 0, sizeof(d));

scanf("%d",&k);

for(int i=0;i>s1>>s2;

d[id(s1)][id(s2)]=1;

}int v = names.size();

for(int k=0;k裝置

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

g.addedge(target[i], v+1, 1); // 插座->匯點

for(int i = 0; i < m; i++)

for(int j = 0; j < n; j++)

if(d[device[i]][target[j]]) g.addedge(device[i], target[j], inf); // 裝置->插座

int r = g.maxflow(v, v+1);

cout << m-r << "\n";

}return 0;

}

POJ 1087 最大流 EK演算法

include include include include include include include includeusing namespace std const int maxn 1003 const int inf 0x3f3f3f3f int n,m int s,t int m1...

poj1273解題報告(最大流 EK演算法)

題目大意 現在有m 個池塘 從1 到m開始編號 1為源點 m為匯點 及 n條水渠 給出這 n條水渠所連線的池塘和所能流過的水量 求水渠中所能流過的水的最大容量 解題思路 最大流的經典題目,套模板即可完成,直接用的lrj的模板 include include include include inclu...

POJ 1087 網路流 最大流

設定源點和匯點,每個需要使用的裝置插座,連線源點到該插座的裝置個數,連線會場提供插座到匯點,容量為個數,然後連線插座轉換邊,容量為無窮 注意轉換插座可能是之前沒出現過的 include include include include include include include include i...