Pagini recente » Cod sursa (job #2599147) | Cod sursa (job #2679669) | Cod sursa (job #697406) | Cod sursa (job #1708791) | Cod sursa (job #1206424)
#include <fstream>
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
int n,m,x,y,z,c[1005][1005],muchia[10005][2],f[1005][1005],trecut[1005],lista[1005],prec[1005],pos1[1005],pos2[1005],sol;
vector<int> lda[1005];
int main()
{
ifstream in ("critice.in");
ofstream out ("critice.out");
in>>n>>m;
for (int i=1;i<=m;++i)
{
in>>x>>y>>z;
muchia[i][0]=x; muchia[i][1]=y;
c[x][y]+=z;
c[y][x]+=z;
lda[x].push_back(y);
lda[y].push_back(x);
}
bool advr=1;
int v,minim;
while (advr)
{
//arborele bfs
memset(trecut,0,sizeof(trecut));
trecut[1]=1; lista[0]=1; lista[1]=1;
for (int i=1;i<=lista[0];++i)
{
v=lista[i];
if (v!=n)
for (int j=0;j<lda[v].size();++j)
{
if (trecut[lda[v][j]]==0 && c[v][lda[v][j]]>f[v][lda[v][j]])
{
++lista[0]; lista[lista[0]]=lda[v][j]; trecut[lda[v][j]]=1; prec[lda[v][j]]=v;
}
}
}
//schimba
if (trecut[n]==1)
{
for (int i=0;i<lda[n].size();++i)
{
if (trecut[lda[n][i]]==1 && c[lda[n][i]][n]>f[lda[n][i]][n])
{
v=n; minim=c[lda[n][i]][v]-f[lda[n][i]][v]; prec[n]=lda[n][i];
while (v!=1)
{
if (minim>c[prec[v]][v]-f[prec[v]][v]) minim=c[prec[v]][v]-f[prec[v]][v];
v=prec[v];
}
v=n;
while (v!=1)
{
f[prec[v]][v]+=minim;
f[v][prec[v]]-=minim;
v=prec[v];
}
}
}
}else advr=0;
}
pos1[1]=1;
lista[0]=1; lista[1]=1;
memset(trecut,0,sizeof(trecut));
trecut[1]=1;
for (int i=1;i<=lista[0];++i)
{
v=lista[i];
for (int j=0;j<lda[v].size();++j)
{
if (f[v][lda[v][j]]!=c[v][lda[v][j]] && trecut[lda[v][j]]==0)
{
++lista[0]; lista[lista[0]]=lda[v][j]; pos1[lda[v][j]]=1; trecut[lda[v][j]]=1;
}
}
}
pos2[n]=1;
lista[0]=1; lista[1]=n;
memset(trecut,0,sizeof(trecut));
trecut[n]=1;
for (int i=1;i<=lista[0];++i)
{
v=lista[i];
for (int j=0;j<lda[v].size();++j)
{
if (f[lda[v][j]][v]!=c[lda[v][j]][v] && trecut[lda[v][j]]==0)
{
++lista[0]; lista[lista[0]]=lda[v][j]; pos2[lda[v][j]]=1; trecut[lda[v][j]]=1;
}
}
}
for (int i=1;i<=m;++i)
{
if (f[muchia[i][0]][muchia[i][1]]==c[muchia[i][0]][muchia[i][1]])
{
if (pos1[muchia[i][0]]==1 && pos2[muchia[i][1]]==1) {++sol;}
}else
if (f[muchia[i][1]][muchia[i][0]]==c[muchia[i][1]][muchia[i][0]])
{
if (pos1[muchia[i][1]]==1 && pos2[muchia[i][0]]==1) {++sol; }
}
}
out<<sol<<"\n";
for (int i=1;i<=m;++i)
{
if (f[muchia[i][0]][muchia[i][1]]==c[muchia[i][0]][muchia[i][1]])
{
if (pos1[muchia[i][0]]==1 && pos2[muchia[i][1]]==1) out<<i<<"\n";
}else
if (f[muchia[i][1]][muchia[i][0]]==c[muchia[i][1]][muchia[i][0]])
{
if (pos1[muchia[i][1]]==1 && pos2[muchia[i][0]]==1) out<<i<<"\n";
}
}
in.close();
out.close();
return 0;
}