Pagini recente » Cod sursa (job #2098616) | Cod sursa (job #2101858) | Cod sursa (job #1084567) | Cod sursa (job #318482) | Cod sursa (job #2008110)
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
const int nmax=1005;
typedef pair<int,int> ii;
ii muc[10*nmax];
int top,cap[nmax][nmax],flux[nmax][nmax],tata[nmax],st[nmax];
bool viz1[nmax],viz2[nmax];
int n,m;
vector<int> g[nmax];
inline bool bfs()
{
queue<int> q;
q.push(1);
memset(tata,0,sizeof(tata));
tata[1]=-1;
int cnode,i,node;
while(!q.empty())
{
node=q.front();
q.pop();
if(node==n)
return 1;
for(i=0;i<g[node].size();++i)
{
cnode=g[node][i];
if(!tata[cnode] && cap[node][cnode] > flux[node][cnode])
{
tata[cnode]=node;
q.push(cnode);
}
}
}
return 0;
}
inline void bfs0(int start,bool viz[])
{
int i,j;
queue<int> q;
q.push(start);
viz[start]=1;
int node,cnode;
while(!q.empty())
{
node=q.front();
q.pop();
for(i=0;i<g[node].size();++i)
{
cnode=g[node][i];
if(viz[cnode] || cap[node][cnode] == flux[node][cnode] || cap[cnode][node] == flux[cnode][node])
continue;
viz[cnode]=1;
q.push(cnode);
}
}
}
int main()
{
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
int i,x,y,c,j;
scanf("%d%d",&n,&m);
for(i=1;i<=m;++i)
{
scanf("%d%d%d",&x,&y,&c);
g[x].push_back(y);
g[y].push_back(x);
cap[x][y]=c;
cap[y][x]=c;
muc[i].first=x;
muc[i].second=y;
}
int cnode,mflux=0;
while(bfs())
{
for(i=0;i<g[n].size();++i)
{
cnode=g[n][i];
if(tata[cnode] && cap[cnode][n] > flux[cnode][n])
{
tata[n]=cnode;
int cflux=2e9;
for(j=n;j!=1;j=tata[j])
cflux=min(cflux,cap[tata[j]][j] - flux[tata[j]][j]);
for(j=n;j!=1;j=tata[j])
{
flux[tata[j]][j]+=cflux;
flux[j][tata[j]]-=cflux;
}
mflux+=cflux;
}
}
}
bfs0(1,viz1);
bfs0(n,viz2);
for(i=1;i<=m;++i)
if( (viz1[muc[i].first] && viz2[muc[i].second]) || (viz2[muc[i].first] && viz1[muc[i].second]) )
st[++top]=i;
printf("%d\n",top);
for(i=1;i<=top;++i)
printf("%d\n",st[i]);
}