Pagini recente » Cod sursa (job #2395272) | Cod sursa (job #2931327) | Cod sursa (job #3041688) | Cod sursa (job #2921021) | Cod sursa (job #2695333)
#include <bits/stdc++.h>
using namespace std;
ifstream f("critice.in");
ofstream g("critice.out");
const int minn=(1<<30);
vector <int> drum[1001];
int capac[1005][1005];
int vizit[1005],ant[1005],n,m,c[1005];
int sol;
queue <int> q;
int firstNode[10050],secondNode[10050];
void BFS (int node)
{
int i;
q.push(node);
memset(vizit,0,sizeof(vizit));
memset(ant,0,sizeof(ant));
vizit[node]=1;
while (!q.empty())
{
node=q.front();
if (node==n)
{
while (!q.empty()) q.pop();
return;
}
q.pop();
for (i=0; i<drum[node].size(); i++)
{
if (vizit[drum[node][i]]==0 && capac[node][drum[node][i]]>0)
{
q.push(drum[node][i]);
vizit[drum[node][i]]=1;
ant[drum[node][i]]=node;
}
}
}
}
void dfs(int node)
{
vizit[node] = true;
for (auto& nextNode : drum[node])
if (!vizit[nextNode] && capac[node][nextNode])
dfs(nextNode);
}
int main()
{
int x,y,z,i,mi;
f>>n>>m;
for (i=1; i<=m; i++)
{
f>>x>>y>>z;
drum[x].push_back(y);
drum[y].push_back(x);
capac[x][y]=z;
capac[y][x] = z;
firstNode[i] = x;
secondNode[i] = y;
}
int aux;
int estedrum=1;
while (estedrum==1)
{
BFS(1);
if (vizit[n]==0) break;
else
{
for (i=0; i<drum[n].size(); i++) if (vizit[drum[n][i]]==1)
{
x=drum[n][i];
mi=minn;
mi=min(capac[drum[n][i]][n],mi);
while (ant[x]!=0)
{
mi=min(mi,capac[ant[x]][x]);
x=ant[x];
}
sol+=mi;
x=drum[n][i];
while (ant[x]!=0)
{
capac[ant[x]][x]-=mi;
capac[x][ant[x]]+=mi;
x=ant[x];
}
capac[drum[n][i]][n]-=mi;
capac[n][drum[n][i]]+=mi;
}
}
}
memset(vizit,0,sizeof(vizit));
int ans = 0;
dfs(1);
for (i =1 ; i<= m; i++)
if (vizit[firstNode[i]] != vizit[secondNode[i]])
ans ++ ;
g << ans <<"\n";
for (i = 1; i <= m; i++)
if (vizit[firstNode[i]] != vizit[secondNode[i]])
g << i << "\n";
return 0;
}