Pagini recente » Cod sursa (job #429058) | Cod sursa (job #1390900) | Cod sursa (job #1304650) | Cod sursa (job #1737305) | Cod sursa (job #175075)
Cod sursa(job #175075)
#include<cstdio>
#include<vector>
const int noduri=1100;
const int muchii=11000;
int n,m,T[noduri],c[noduri][noduri],x,y,cst,l[noduri],i,j,lm[muchii][2];
std::vector<int> a[noduri];
int bf()
{
int st=0,dr=0,vf;
memset(T,0,sizeof(T));
l[0]=1;T[1]=1;
while(st<=dr)
{
vf=l[st];
if(vf!=n)
for(i=0;i<a[vf].size();i++)
if(c[vf][a[vf][i]]>0 && !T[a[vf][i]])
{
T[a[vf][i]]=vf;
l[++dr]=a[vf][i];
}
st++;
}
return T[n];
}
inline void flux()
{
//facem fluxul si scadem din muchii costurile drumurilor de crestere
int r;
while(bf())
for(i=1;i<n;i++)
if(c[i][n]>0)
{
r=c[i][n];
for(j=i;j!=1 && r;j=T[j])
if(r>c[j][T[j]]) r=c[j][T[j]];
if(!r) continue;
c[i][n]-=r;
c[n][i]-=r;
for(j=i;j!=1;j=T[j])
{
c[j][T[j]]-=r;
c[T[j]][j]-=r;
}
}
}
inline void bf2(int vf,int parte)
{
int st=0,dr=0;
l[0]=vf;
T[vf]=parte;
while(st<=dr)
{
vf=l[st];
for(i=0;i<a[vf].size();i++)
if(c[vf][a[vf][i]] && !T[a[vf][i]])
{
T[a[vf][i]]=parte;
l[++dr]=a[vf][i];
}
st++;
}
}
inline void solve()
{
//fara a lua in considerare muchiile care au ajuns cu costul la 0
//graful este impartit in cel putin 2 subgrafuri unul care contine nodul 1
//si unul care contine nodul n
//notam toate nodurile din componenta conexa ce contine pe 1 cu 1
//si pe cele din componenta conexa ce contine pen cu 2
memset(T,0,sizeof(T));
bf2(1,1);
bf2(n,2);
int st=0;
//tunelele critice sunt muchiile care
//au ajuns cu costul la 0 si unsec componenta 1 cu componenta 2
for(i=1;i<=m;i++)
if(!c[lm[i][0]][lm[i][1]] && T[lm[i][1]] && T[lm[i][0]] && T[lm[i][0]]!=T[lm[i][1]])
l[++st]=i;
printf("%d\n",st);
for(i=1;i<=st;i++)
printf("%d\n",l[i]);
}
int main()
{
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
scanf("%d %d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&x,&y,&cst);
a[x].push_back(y);
a[y].push_back(x);
c[x][y]=c[y][x]=cst;
lm[i][0]=x;lm[i][1]=y;
if(cst<0) for(;;);
}
flux();
solve();
fclose(stdout);
return 0;
}