Pagini recente » Cod sursa (job #1859000) | Cod sursa (job #1910689) | Cod sursa (job #2514134) | Cod sursa (job #998704) | Cod sursa (job #626760)
Cod sursa(job #626760)
#include<fstream>
#include<vector>
#include<queue>
#define N 1001
using namespace std;
ifstream in("critice.in");
ofstream out("critice.out");
int n,m,co[N][N],flux[N][N],p[N],nrm[N][N];
vector<pair<int,int> > g[N];
bool viz[N],ver1[N],ver2[N];
bool bf() {
queue<int> q;
vector<pair<int,int> >::iterator it;
int i;
for(i=1;i<=n;++i) {
viz[i]=false;
p[i]=0;
}
q.push(1);
while(!q.empty()) {
for(it=g[q.front()].begin();it!=g[q.front()].end();++it) if(!viz[it->first] && co[q.front()][it->first] - flux[q.front()][it->first]>0) {
q.push(it->first);
p[it->first]=q.front();
viz[it->first]=true;
}
q.pop();
}
if(!p[n])
return 0;
return 1;
}
void dinic() {
int i,j,smin;
while(bf())
for(j=1;j!=n;++j) if(co[j][n] - flux[j][n]>0) {
smin=1<<20;
if(co[j][n] - flux[j][n]<smin)
smin=co[j][n] - flux[j][n];
for(i=j;i!=1;i=p[i])
if(co[p[i]][i] - flux[p[i]][i]<smin)
smin=co[p[i]][i] - flux[p[i]][i];
if(smin==1<<20)
continue;
flux[j][n]+=smin;
flux[n][j]-=smin;
for(i=j;i!=1;i=p[i]) {
flux[p[i]][i]+=smin;
flux[i][p[i]]-=smin;
}
}
}
void bf1() {
queue<int> q;
vector<pair<int,int> >::iterator it;
q.push(1); ver1[1]=true;
while(!q.empty()) {
for(it=g[q.front()].begin();it!=g[q.front()].end();++it) if(!ver1[it->first] && co[q.front()][it->first] - flux[q.front()][it->first]>0) {
ver1[it->first]=true;
q.push(it->first);
}
q.pop();
}
}
void bf2() {
queue<int> q;
vector<pair<int,int> >::iterator it;
q.push(n); ver2[n]=true;
while(!q.empty()) {
for(it=g[q.front()].begin();it!=g[q.front()].end();++it) if(!ver2[it->first] && co[it->first][q.front()] - flux[it->first][q.front()]>0) {
ver2[it->first]=true;
q.push(it->first);
}
q.pop();
}
}
int main() {
int i,a,b,c,nr=0;
vector<pair<int,int> >::iterator it;
in >> n >> m;
for(i=1;i<=m;++i) {
in >> a >> b >> c;
g[a].push_back(pair<int,int>(b,i));
g[b].push_back(pair<int,int>(a,i));
co[a][b]+=c;
co[b][a]+=c;
nrm[a][b]=nrm[b][a]=i;
}
dinic();
bf1();
bf2();
for(i=1;i<=n;++i)
for(it=g[i].begin();it!=g[i].end();++it)
if(ver1[i] && !ver1[it->first] && ver2[it->first] && !ver2[i])
++nr;
out << nr << "\n";
for(i=1;i<=n;++i)
for(it=g[i].begin();it!=g[i].end();++it)
if(ver1[i] && !ver1[it->first] && ver2[it->first] && !ver2[i])
out << nrm[i][it->first] << "\n";
return 0;
}