Pagini recente » Cod sursa (job #885161) | Cod sursa (job #1709929) | Cod sursa (job #864880) | Cod sursa (job #1722757) | Cod sursa (job #404797)
Cod sursa(job #404797)
#include<fstream>
#include<algorithm>
using namespace std;
struct matrice{
int ind;
int val;};
matrice x[1003][10003];
int t[1024],critice[1024],n,m,nrsol,xu[1024],yu[1024],nrc;
struct nod{
int info;
nod *next;};
nod *g[1003];
void ek();
void adauga(int a,int b);
ofstream fout("critice.out");
void verif ();
int bfs(int sursa,int des);
int main()
{
ifstream fin("critice.in");
fin>>n>>m;
int i;
for(i=1;i<=m;i++)
{
int a,b,c;
fin>>a>>b>>c;
x[a][b].val=c;
x[b][a].val=c;
x[a][b].ind=i;
x[b][a].ind=i;
adauga(a,b);
adauga(b,a);
}
ek();
for(i=1;i<=nrsol;i++)
if(xu[i]==1 || bfs(xu[i],1) && (yu[i]==n)|| bfs(yu[i],n))
critice[++nrc]=x[xu[i]][yu[i]].ind;
fout<<nrc<<endl;
sort(critice+1,critice+nrc+1);
for(i=1;i<=nrc;i++)
fout<<critice[i]<<endl;
return 0;
}
int bfs(int sursa,int des)
{
int coada[1024],st,dr,i;
st=dr=1;
for(i=1;i<=n;i++)
t[i]=-1;
coada[st]=sursa;
t[sursa]=0;
while(st<=dr)
{
int k=coada[st++];
for(nod *p=g[k];p;p=p->next)
if(t[p->info]==-1 && x[k][p->info].val>0)
{
t[p->info]=k;
if(p->info==des)
return 1;
coada[++dr]=p->info;
}
}
return 0;
}
void ek()
{
int i,cmin=1000000000;
while(bfs(1,n))
{
cmin=1000000000;
for(i=n;t[i];i=t[i])
if(x[t[i]][i].val<cmin)
cmin=x[t[i]][i].val;
for(i=n;t[i];i=t[i])
{
x[t[i]][i].val-=cmin;
x[i][t[i]].val-=cmin;
if(x[i][t[i]].val==0)
xu[++nrsol]=t[i],yu[nrsol]=i;
}
}
}
void adauga(int a,int b)
{
nod *p;
p=new nod;
p->info=b;
p->next=g[a];
g[a]=p;
}