Pagini recente » Cod sursa (job #2100748) | Cod sursa (job #3196590) | Cod sursa (job #1647614) | Cod sursa (job #260058) | Cod sursa (job #1708637)
#include<bits/stdc++.h>
using namespace std;
typedef struct lnod {
int nod;
lnod *next;
}*nod;
const int INF=1e9+69*69;
int i,n,m,x,y,z,cap[1005][1005],q[1005],qt,qh,tata[1005];
bool viz[1005],froms[1005],fromf[1005];
pair<int,int> edges[10005];
vector<int> rs;
nod lda[1005];
void add(int x,nod &y) {
nod p=new lnod;
p->nod=x;
p->next=y;
y=p;
}
void Update() {
int addflow=INF;
for(x=n;x!=1;x=tata[x]) addflow=min(addflow,cap[tata[x]][x]);
for(x=n;x!=1;x=tata[x]) cap[tata[x]][x]-=addflow,cap[x][tata[x]]+=addflow;
}
bool bfs() {
bool u=0;
memset(viz,0,sizeof(viz));
viz[1]=q[1]=tata[1]=1;
for(qt=qh=1;qh<=qt;++qh)
for(nod p=lda[q[qh]];p;p=p->next)
if(cap[q[qh]][p->nod]>0 && !viz[p->nod])
{
tata[p->nod]=q[qh]; q[++qt]=p->nod; viz[p->nod]=1;
if(p->nod==n) Update(),--qt,viz[n]=0,u=1;
}
return u;
}
void dfs(int x,int from) {
if(from) fromf[x]=1; else froms[x]=1;
for(nod p=lda[x];p;p=p->next)
if(from && !fromf[p->nod] && cap[x][p->nod]>0 && cap[p->nod][x]>0) dfs(p->nod,from);
else if(!from && !froms[p->nod] && cap[x][p->nod]>0 && cap[p->nod][x]>0) dfs(p->nod,from);
}
int main()
{
ifstream cin("critice.in");
ofstream cout("critice.out");
ios_base::sync_with_stdio(0); cin.tie(0);
cin>>n>>m;
for(i=1;i<=m;++i)
{
cin>>x>>y>>z;
edges[i]=make_pair(x,y);
add(x,lda[y]); cap[x][y]=z;
add(y,lda[x]); cap[y][x]=z;
}
while(bfs());
dfs(1,0); dfs(n,1);
for(i=1;i<=m;++i)
{
x=edges[i].first; y=edges[i].second;
if((!cap[x][y] || !cap[y][x]) && ((froms[x] && fromf[y]) || (fromf[x] && froms[y]))) rs.push_back(i);
}
cout<<rs.size()<<'\n';
for(auto it:rs) cout<<it<<'\n';
return 0;
}