Pagini recente » Cod sursa (job #599079) | Cod sursa (job #1065332) | Cod sursa (job #985688) | Cod sursa (job #2174109) | Cod sursa (job #477311)
Cod sursa(job #477311)
#include<fstream>
#include<vector>
#include<cstring>
#include<queue>
#include<cassert>
using namespace std;
const char iname[]="algola.in";
const char oname[]="algola.out";
const int maxn=560;
const int inf=0x3f3f3f3f;
ifstream f(iname);
ofstream g(oname);
int C[maxn][maxn],F[maxn][maxn],flow,i,j,n,x,y,m,S=0,D=maxn-1,A[maxn],many,t;
vector<int> E[maxn];
bool bfs()
{
memset(A,-1,sizeof(A));
A[S]=0;
queue<int> Q;
Q.push(S);
while(!Q.empty())
{
x=Q.front();
Q.pop();
if(x==D)
break;
for(vector<int>::iterator it=E[x].begin();it!=E[x].end();++it)
if(A[*it]==-1&&C[x][*it]>F[x][*it])
A[*it]=x,Q.push(*it);
}
return (A[D]!=-1);
}
int muchii[maxn][3];
int main()
{
f>>n>>m;
for(i=1;i<=n;++i)
E[S].push_back(i),E[i].push_back(S),f>>C[S][i],many+=C[S][i];
for(i=1;i<=m;++i)
f>>muchii[i][0]>>muchii[i][1]>>muchii[i][2];
E[1].push_back(D);
E[D].push_back(1);
C[1][D]=inf;
assert(many<=100);
do
{
for(;bfs();)
{
int mint=inf;
for(i=D;i!=S;i=A[i])
mint=min(mint,C[A[i]][i]-F[A[i]][i]);
flow+=mint;
for(i=D;i!=S;i=A[i])
F[A[i]][i]+=mint,F[i][A[i]]-=mint;
}
for(i=n*t+1;i<=n*t+n;++i)
C[i][i+n]=inf,E[i].push_back(i+n),E[i+n].push_back(i);
for(i=1;i<=m;++i)
C[muchii[i][0]+n*t][muchii[i][1]+n*t+n]=C[muchii[i][1]+n*t][muchii[i][0]+n*t+n]=muchii[i][2],
E[muchii[i][0]+n*t].push_back(muchii[i][1]+n*t+n),E[muchii[i][1]+n*t+n].push_back(muchii[i][0]+n*t),
E[muchii[i][1]+n*t].push_back(muchii[i][0]+n*t+n),E[muchii[i][0]+n*t+n].push_back(muchii[i][1]+n*t);
++t;
C[n*t+1][D]=inf;
E[n*t+1].push_back(D);
}while(flow<many);
g<<t-1<<"\n";
}