Pagini recente » Cod sursa (job #3277409) | Cod sursa (job #405960) | Cod sursa (job #865640) | Cod sursa (job #2227139) | Cod sursa (job #907181)
Cod sursa(job #907181)
#include<fstream>
#include<algorithm>
#include<queue>
using namespace std;
int i,j,n,m,t[1001][1001],fl[1001][1001],flux,min1,aux;
int tata[1001],rez[100001],nr=0;
bool viz[1001];
queue<int> q;
struct costuri
{
int x,y,cost;
};
costuri a[100001];
int bf()
{
int i,x;
for(i=1;i<=n;++i)
viz[i]=0;
q.push(1);
while(!q.empty())
{
x=q.front();
for(i=1;i<=n;++i)
if(t[x][i]-fl[x][i]>0&&!viz[i])
{
viz[i]=1;
tata[i]=x;
q.push(i);
}
q.pop();
}
return viz[n];
}
bool saturat(int x,int y)
{
if(max(fl[x][y],fl[y][x])==t[x][y])
return 1;
return 0;
}
void bf2(int x,int y)
{
int i;
q.push(x);
tata[x]=x;
while(!q.empty())
{
x=q.front();
for(i=1;i<=n;++i)
if(!tata[i]&&t[x][i]&&!saturat(x,i))
{
tata[i]=y;
q.push(i);
}
q.pop();
}
}
bool drum(int x,int y)
{
if((tata[1]==tata[x]&&tata[y]==tata[n])||(tata[x]==tata[n]&&tata[1]==tata[y]))
return 1;
return 0;
}
int main()
{
ifstream f("critice.in");
ofstream g("critice.out");
f>>n>>m;
for(i=1;i<=m;++i)
{
f>>a[i].x>>a[i].y>>a[i].cost;
t[a[i].x][a[i].y]=t[a[i].y][a[i].x]=a[i].cost;
}
while(bf())
{
for(i=1;i<=n;++i)
if(t[i][n]-fl[i][n]>0)
{
min1=t[i][n]-fl[i][n];
for(j=i;j!=1;j=tata[j])
if(t[tata[j]][j]-fl[tata[j]][j]<min1)
min1=t[tata[j]][j]-fl[tata[j]][j];
for(j=i;j!=1;j=tata[j])
{
fl[tata[j]][j]+=min1;
fl[j][tata[j]]-=min1;
}
fl[i][n]+=min1;
fl[n][i]-=min1;
flux+=min1;
}
}
for(i=1;i<=n;++i)
tata[i]=0;
for(i=1;i<=n;++i)
if(!tata[i])
bf2(i,i);
for(i=1;i<=m;++i)
if(saturat(a[i].x,a[i].y))
if(drum(a[i].x,a[i].y))
rez[++nr]=i;
g<<nr<<"\n";
for(i=1;i<=nr;++i)
g<<rez[i]<<"\n";
return 0;
}