Pagini recente » Cod sursa (job #2694244) | Cod sursa (job #1691632) | Cod sursa (job #2631887) | Cod sursa (job #2045880) | Cod sursa (job #1009760)
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<queue>
#define pb push_back
#define maxn 1005
#define maxm 10005
#define inf 0x3f3f3f3f
using namespace std;
int n,m,nr,flow;
int v[maxn],father[maxn],used[2][maxn];
int X[maxm],Y[maxm];
int c[maxn][maxn],f[maxn][maxn];
vector<int> l[maxn],sol;
void read()
{
int x,y,cst;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&cst);
c[x][y]=c[y][x]=cst;
l[x].pb(y); l[y].pb(x);
X[i]=x; Y[i]=y;
}
}
int bfs()
{
int k;
queue<int> q;
for(q.push(1),v[1]=nr,father[1]=0;!q.empty();q.pop())
{
k=q.front();
if(k==n) continue;
for(unsigned int i=0;i<l[k].size();i++)
if(v[l[k][i]]!=nr && c[k][l[k][i]]>f[k][l[k][i]])
{
q.push(l[k][i]); v[l[k][i]]=nr;
father[l[k][i]]=k;
}
}
if(v[n]==nr) return 1;
return 0;
}
void ed_karp()
{
int Min; nr=1;
while(bfs())
{
for(unsigned int i=0;i<l[n].size();i++)
if(v[l[n][i]]==nr && f[l[n][i]][n]!=c[l[n][i]][n])
{
Min=inf;
father[n]=l[n][i];
for(int j=n;j!=1;j=father[j])
Min=min(Min,c[father[j]][j]-f[father[j]][j]);
for(int j=n;j!=1;j=father[j])
{
f[father[j]][j]+=Min;
f[j][father[j]]-=Min;
}
flow+=Min;
}
nr++;
}
}
void BFS(int source,int ind)
{
int k;
queue<int> q;
used[ind][1]=1;
for(q.push(source);!q.empty();q.pop())
{
k=q.front();
for(unsigned int i=0;i<l[k].size();i++)
if(!used[ind][l[k][i]] && c[k][l[k][i]]>f[k][l[k][i]] && c[l[k][i]][k]>f[l[k][i]][k])
{
q.push(l[k][i]);
used[ind][l[k][i]]=1;
}
}
}
void solve()
{
for(int i=1;i<=m;i++)
if( (used[0][X[i]] && used[1][Y[i]]) || (used[1][X[i]] && used[0][Y[i]]) )
sol.pb(i);
}
void print()
{
printf("%d\n",sol.size());
for(unsigned int i=0;i<sol.size();i++)
printf("%d\n",sol[i]);
}
int main()
{
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
read();
ed_karp();
BFS(1,0);
BFS(n,1);
solve();
print();
fclose(stdin);
fclose(stdout);
return 0;
}