Pagini recente » Cod sursa (job #1685139) | Cod sursa (job #641879)
Cod sursa(job #641879)
#include<fstream>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
struct per
{
int a,b;
} muchii[10001];
int i,j,n,m,c[1001][1001],flux[1001][1001],x,y,tata[1001],minim,flux_maxim,k;
vector<int> lista[1001], rez;
//vector< pair <int,int> > muchii;
queue<int> coada;
char viz[1001],fplus[1001],fminus[1001];
ifstream f("critice.in");
ofstream g("critice.out");
int caut(int a,int b)
{
int i;
for(i=1;i<=m;++i) if(muchii[i].a==a&&muchii[i].b==b || muchii[i].b==a&&muchii[i].a==b) return i;
return 0;
}
int bf()
{
memset(viz,0,sizeof(viz));
memset(tata,0,sizeof(tata));
int x,i,nr_vecini,vecin;
coada.push(1);
// g<<1<<' ';
while(!coada.empty())
{
x=coada.front(); coada.pop();
nr_vecini=lista[x].size();
for(i=0;i<nr_vecini;i++)
{
vecin=lista[x][i];
if(!viz[vecin]&&flux[x][vecin]<c[x][vecin])
{
viz[vecin]=1;
tata[vecin]=x;
coada.push(vecin);
//g<<vecin<<' ';
}
}
}
//g<<" sfarsit_coada\n";
return viz[n];
}
void bf_plus()
{
memset(viz,0,sizeof(viz));
int x,i,nr_vecini,vecin;
coada.push(1);
fplus[1]='1';
// g<<1<<' ';
while(!coada.empty())
{
x=coada.front(); coada.pop();
nr_vecini=lista[x].size();
for(i=0;i<nr_vecini;i++)
{
vecin=lista[x][i];
if(!viz[vecin]&&flux[x][vecin]<c[x][vecin])
{
viz[vecin]=fplus[vecin]='1';
coada.push(vecin);
}
}
}
}
void bf_minus()
{
memset(viz,0,sizeof(viz));
int x,i,nr_vecini,vecin;
coada.push(n);
fminus[n]='1';
// g<<1<<' ';
while(!coada.empty())
{
x=coada.front(); coada.pop();
nr_vecini=lista[x].size();
for(i=0;i<nr_vecini;i++)
{
vecin=lista[x][i];
if(!viz[vecin]&&flux[x][vecin]<c[x][vecin])
{
fminus[vecin]=viz[vecin]='1';
coada.push(vecin);
}
}
}
}
int main()
{
f>>n>>m;
for(i=1;i<=m;i++)
{
f>>x>>y>>j;
muchii[i].a=x;
muchii[i].b=y;
//muchii.push_back(make_pair(x,y));
lista[x].push_back(y);
lista[y].push_back(x);
if(x==1||y==n) c[x][y]=j;
else if(y==1||x==n) c[y][x]=j;
else c[x][y]=c[y][x]=j;
}
while(bf())
{
for(i=1;i<n;i++)
if(tata[i] && flux[i][n]<c[i][n])
{
minim=c[i][n]-flux[i][n];
for(j=i;j!=1;j=tata[j])
if(c[tata[j]][j]-flux[tata[j]][j]<minim)
minim=c[tata[j]][j]-flux[tata[j]][j];
if(minim)
{
flux[i][n]=flux[i][n]+ minim;
flux[n][i]=flux[n][i]- minim;
for(j=i;j!=1;j=tata[j])
{
flux[tata[j]][j]=flux[tata[j]][j]+ minim;
flux[j][tata[j]]=flux[j][tata[j]]-minim;
}
//g<<" adaug la flux "<<minim<<'\n';
flux_maxim=flux_maxim+minim;
}
}
}
bf_plus(); bf_minus();
//g<<fplus+1<<'\n'<<fminus+1<<'\n';
for(i=1;i<=m;++i)
if( (fplus[muchii[i].a] && fminus[muchii[i].b]) || (fplus[muchii[i].b] && fminus[muchii[i].a]) ) ++k, rez.push_back(i);
//g<<flux_maxim<<'\n';
/*for(i=1;i<=n;++i)
{
j=lista[i].size();
for(int q=0;q<j;++q)
if(c[i][lista[i][q]]>=0)
{
//g<<i<<' '<<lista[i][q]<<'\n';
++c[i][lista[i][q]];
if(bf())
{
++k;
int w=caut(i,lista[i][q]);
rez.push_back(w);
//g<<i<<' '<<lista[i][q]<<'\n';
}
--c[i][lista[i][q]];
}
}*/
g<<k<<'\n';
for(i=0;i<k;++i) g<<rez[i]<<'\n';
f.close();g.close();
return 0;
}