Pagini recente » Cod sursa (job #1032171) | Cod sursa (job #2205003) | Cod sursa (job #834532) | Cod sursa (job #366137) | Cod sursa (job #1899836)
#include <fstream>
#define pi pair<int,int>
#define x first
#define y second
#include <vector>
#include <bitset>
#include <queue>
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
const int MAX_INF=0x3f3f3f3f;
int f[1001][1001],c[1001][1001],n,tata[1001];
pi edge[10001];
vector<int>H[1001],sol;
bitset<1001>viz,source,sink;
queue<int>Q;
bool bfs()
{
viz[1]=1;
Q.push(1);
while(Q.size())
{
int a=Q.front();
Q.pop();
if(a==n) continue;
for(vector<int>::iterator it=H[a].begin();it!=H[a].end();it++)
{
//int dp=*it;
if(viz[*it]==0&& (c[a][*it]!=f[a][*it]))
{
viz[*it]=1;
Q.push(*it);
tata[*it]=a;
}
}
}
if(viz[n]==1) return 1;
return 0;
}
void BFS(int start,bitset<1001> &use)
{
use[start]=1;
Q.push(start);
while(Q.size())
{
int a=Q.front();
Q.pop();
for(vector<int>::iterator it=H[a].begin();it!=H[a].end();it++)
{
if(use[*it]==0)
{
int flux=f[a][*it];
if(flux<0) flux=-flux;
if(c[a][*it]>flux)
{
use[*it]=1;
Q.push(*it);
}
}
}
}
}
int main()
{
int m,i,cost,a,b,fmin;
fin>>n>>m;
for(i=1;i<=m;i++)
{
fin>>a>>b>>cost;
edge[i].x=a;edge[i].y=b;
c[a][b]=cost;
c[b][a]=cost;
H[a].push_back(b);
H[b].push_back(a);
}
int flux=0;
while(bfs())
{
for(vector<int>::iterator it=H[n].begin();it!=H[n].end();it++)
{
if(c[*it][n]!=f[*it][n]&&viz[*it]==1)
{
fmin=MAX_INF;
tata[n]=*it;
for(i=n;i!=1;i=tata[i])
{
fmin=min(fmin,c[tata[i]][i]-f[tata[i]][i]);
}
if(fmin==0) continue;
flux+=fmin;
for(i=n;i!=1;i=tata[i])
{
f[tata[i]][i]+=fmin;
f[i][tata[i]]-=fmin;
}
}
}
viz.reset();
}
BFS(1,source);
BFS(n,sink);
for(i=1;i<=m;i++)
{
int x=edge[i].x,y=edge[i].y;
if((source[x]&&sink[y])||(sink[x]&&source[y]))
{
if(c[x][y]==f[x][y]||c[y][x]==f[y][x])
{
sol.push_back(i);
}
}
}
fout<<sol.size()<<"\n";
for(vector<int>::iterator it=sol.begin();it!=sol.end();it++) fout<<*it<<"\n";
}