Pagini recente » Cod sursa (job #2321526) | Cod sursa (job #1597226) | Cod sursa (job #126530) | Cod sursa (job #126524) | Cod sursa (job #724731)
Cod sursa(job #724731)
#include <stdio.h>
#include <string.h>
#include <queue>
inline int min(int a,int b){return a<b?a:b;}
using namespace std;
int n, maxflow = 0, flow;
int a[1001][1001],m[1001][1001],con,muchii[1001][10001],a_catea[1001],numanoi;
int t[1001];
queue<int> coada;
FILE *fout = fopen("critice.out", "w");
void read();
void solve();
void write();
int bfs();
int testez(int i,int j)
{
int aux1,aux2;
aux1=a[i][j];
aux2=a[j][i];
a[i][j]=a[j][i]=0;
bfs();
//daca am atins unul dintre capete
if (t[i]==1||t[j]==1) return 1;
a[i][j]=aux1;
a[j][i]=aux2;
return 0;
}
int main()
{int i,j;
read();
solve();
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
if ((m[i][j]==a[j][i]||m[j][i]==a[i][j])&&(muchii[i][j]||muchii[j][i]))
if (testez(i,j))
{con++;
a_catea[muchii[i][j]]=1;}
write();
return 0;
}
int bfs()
{
int i, nod;
//golesc coada
//deoarece folosesc coada de mai multe ori
//o apelez din bfs()
while (!coada.empty())
coada.pop();
memset(t,0,sizeof(t));
//pun in vectorul t valoare 0(zero)
coada.push(1);
//pun in coada valoarea 1
t[1]=1; //t vine de la tata
while (!coada.empty())
{
nod = coada.front();
for (i = 2; i <= n; ++i)
if (a[nod][i] && !t[i])
{
t[i] = nod;
if (i==n) return 1; //am ajuns la nodul destinatie
coada.push(i);
}
coada.pop(); //elimin primul element din coada
}
return 0; //nu pot ajunge la nodul destinatie
}
void solve()
{
int i;
while (bfs())
{
flow = 1000000;
//determin fluxul minim
for (i = n; i!=1; i=t[i])
{
flow=min(flow,a[t[i]][i]);
}
for (i = n; i!=1; i = t[i])
{
a[t[i]][i] -= flow;
a[i][t[i]] += flow;
}
maxflow += flow;
}
}
void write()
{
fprintf(fout, "%d\n", con);
int i,j;
for(i=1;i<=numanoi;i++)
if (a_catea[i]==1) fprintf(fout,"%d\n",i);
fclose(fout);
}
void read()
{
int m, x, y, z,i,j;
FILE *fin = fopen("critice.in", "r");
fscanf(fin, "%d%d", &n, &m);
for (i=1;i<= m; i++)
{
fscanf(fin, "%d%d%d", &x, &y, &z);
a[x][y] = z;
muchii[y][x]=muchii[x][y]=i;
}
numanoi=m;
fclose(fin);
}