Pagini recente » Cod sursa (job #3195749) | Cod sursa (job #3151129) | Cod sursa (job #2028506) | Cod sursa (job #2360564) | Cod sursa (job #1464612)
#include<stdio.h>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#define NMax 1005
#define MMax 10005
#define INFINIT 99999999
using namespace std;
int n,m,nr,flow;
int v[NMax],father[NMax],used[2][NMax];
int X[MMax],Y[MMax];
int cost[NMax][NMax],flux[NMax][NMax];
vector<int> Graf[NMax],sol;
void Read()
{
int x,y,z;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
cost[x][y]=cost[y][x]=z;
Graf[x].push_back(y);
Graf[y].push_back(x);
X[i]=x; Y[i]=y;
}
}
int BFS1()
{
queue<int> q;
for(q.push(1),v[1]=nr,father[1]=0;!q.empty();q.pop())
{
int k=q.front();
if(k==n) continue;
for(unsigned int i=0;i<Graf[k].size();i++)
if(v[Graf[k][i]]!=nr && cost[k][Graf[k][i]]>flux[k][Graf[k][i]])
{
q.push(Graf[k][i]);
v[Graf[k][i]]=nr;
father[Graf[k][i]]=k;
}
}
if(v[n]==nr) return 1;
return 0;
}
void ed_karp()
{
int Min;
nr=1;
while(BFS1())
{
for(int i=0;i<Graf[n].size();i++)
if(v[Graf[n][i]]==nr && flux[Graf[n][i]][n]<cost[Graf[n][i]][n])
{
Min=INFINIT;
father[n]=Graf[n][i];
for(int j=n;j!=1;j=father[j])
Min=min(Min,cost[father[j]][j]-flux[father[j]][j]);
for(int j=n;j!=1;j=father[j])
{
flux[father[j]][j]+=Min;
flux[j][father[j]]-=Min;
}
flow+=Min;
}
nr++;
}
}
void BFS(int source,int ind)
{
int k;
queue<int> q;
used[ind][source]=1;
for(q.push(source);!q.empty();q.pop())
{
k=q.front();
for(unsigned int i=0;i<Graf[k].size();i++)
if(!used[ind][Graf[k][i]] && cost[k][Graf[k][i]]>abs(flux[k][Graf[k][i]]))
{
q.push(Graf[k][i]);
used[ind][Graf[k][i]]=1;
}
}
}
void solve()
{
int x,y;
for(int i=1;i<=m;i++)
{
x=X[i]; y=Y[i];
if((used[0][x] && used[1][y] && cost[x][y]==flux[x][y]) || (used[0][y] && used[1][x] && cost[y][x]==flux[y][x]))
sol.push_back(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;
}