Pagini recente » Cod sursa (job #1035720) | Cod sursa (job #1302924) | Cod sursa (job #2469656) | Cod sursa (job #1513936) | Cod sursa (job #1565462)
#include <stdio.h>
#include <cstring>
#include <vector>
#include <queue>
#define nmax 1010
#define lmax 10010
using namespace std;
struct date { int x,y; };
int n,m,x,y,z;
int fr[nmax],tata[nmax];
int capacity[nmax][nmax],flux[nmax][nmax];
bool s[nmax],f[nmax];
vector <int> g[nmax],sol; date t[lmax];
bool bfs()
{
memset(fr,0,sizeof(fr));
queue <int> que;
que.push(1); fr[1]=1;
while (!que.empty()) {
int x=que.front(); que.pop();
if (x==n) continue;
for (unsigned int i=0;i<g[x].size();i++)
if (fr[g[x][i]]==0 && capacity[x][g[x][i]]!=flux[x][g[x][i]]) {
fr[g[x][i]]=1; tata[g[x][i]]=x; que.push(g[x][i]);
}
}
return (fr[n]==1);
}
void dfs(bool v[nmax],int nod)
{
v[nod]=true;
for (unsigned int i=0;i<g[nod].size();i++) {
if (!v[g[nod][i]] && flux[nod][g[nod][i]]!=capacity[nod][g[nod][i]] && flux[g[nod][i]][nod]!=capacity[g[nod][i]][nod])
dfs(v,g[nod][i]);
}
}
int main()
{
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
scanf("%d %d",&n,&m);
for (int i=1;i<=m;i++) {
scanf("%d %d %d",&x,&y,&z);
capacity[x][y]=capacity[y][x]=z;
g[x].push_back(y); g[y].push_back(x);
t[i].x=x; t[i].y=y;
}
//max flow
while (bfs()) {
for (unsigned int i=0;i<g[n].size();i++)
if (fr[g[n][i]]==1 && capacity[g[n][i]][n]!=flux[g[n][i]][n]) {
tata[n]=g[n][i]; int fmin=2e9;
for (int j=n;j>1;j=tata[j])
fmin=min(fmin,capacity[tata[j]][j]-flux[tata[j]][j]);
if (fmin==0) continue;
for (int j=n;j>1;j=tata[j]) {
flux[tata[j]][j]+=fmin;
flux[j][tata[j]]-=fmin;
}
}
}
dfs(s,1); dfs(f,n);
for (int i=1;i<=m;i++)
if ((s[t[i].x] && f[t[i].y]) || (s[t[i].y] && f[t[i].x])) sol.push_back(i);
printf("%d\n",sol.size());
for (unsigned int i=0;i<sol.size();i++) printf("%d\n",sol[i]);
return 0;
}