題意:
n個插座和m個插頭,k種轉換器(每種都是無限個,可以把插頭轉換成其他型別的插頭),求最少剩多少個插頭沒插上插座。
思路:首先給所有插頭或插座以及轉換器中涉及到的型別編號。然後根據轉換器建立型別之間的轉化關係,接著用floyd演算法算出每個裝置所有適配的型別,並將其容量設為inf,表示轉換器數量充足,可以有多個裝置用同一種轉換器。
接著構建網路:所有的裝置型別和源點連一條弧,容量為1(注意累加,比如有2個裝置型別都是b,那麼從源點到b的容量應該為2),所有的插座型別和匯點連弧,容量為1。
然後用最大流演算法
#include #include #include #include #include #include #define fi first
#define se second
#define pii pairusing namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = 400+5;
int n;
int cap[maxn][maxn], flow[maxn][maxn], dis[maxn];
mapmp;
int id(string s)
void floyd()
} }}bool bfs(int s, int t)
} }return dis[t] != -1;
}int dfs(int s, int t, int f)
} return ans;
}int dinic(int s, int t)
return ans;
}int main()
cin>>m;
for(int i = 0; i < m; ++i)
cin>>k;
for(int i = 0; i < k; ++i)
n = mp.size();
for(int i = 0; i < n; ++i) cap[i][i] = inf;
floyd();
for(int i = 0; i < vec2.size(); ++i) cap[n][vec2[i]] += 1; // 超級源點
for(int i = 0; i < vec1.size(); ++i) cap[vec1[i]][n+1] = 1; // 超級匯點
int ans = dinic(n, n+1);
cout
}
最大流,Floyd(UNIX插頭 uva 753)
給n個插座,m個裝置和k種轉換器 n,m,k 100 每種轉換器有無限多。已知每個插座型別,每個裝置的插頭型別,以及每種轉換器的插座型別和插頭型別。插頭和插座型別用不超過24各字母表示,插頭只能插到型別相同的插座中。乙個裝置的插頭可以直接插入插座中也可以經過乙個或多個轉換器後再插入插座中。一開始跟著...
UVA 753(最大流匹配)
s 往m個裝置流1,然後每個裝置往對應插口號流1,然後插口號之間的k個轉換邊流無窮大 代表該裝備能被利用無窮遍 然後插排號流1到對應的n個插排,然後每個插排流1到匯點。pragma comment linker,stack 1024000000,1024000000 include include ...
uva10806 (最小費用最大流)
題意 從1到n 再從n到1 不經過重複的邊 如果是點就是旅行商問題了 問最短路 思路 最小費用最大流 建立乙個超級源 它的容量為2,到第乙個點的費用為0 然後每個連線的點的容量為1 只要找出兩條最小費用的路 那麼就可以了。include using namespace std include inc...