Pagini recente » Cod sursa (job #3179894) | Cod sursa (job #68930) | Cod sursa (job #1691502) | Cod sursa (job #551924) | Cod sursa (job #2594528)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
bool viz[1001];
vector <int> g[1001],sol;
queue <int> q;
int n,m;
int tata[1001];
int f[1001][1001],c[1001][1001];
struct muchii
{
int x,y,c;
}v[10001];
void reinit()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
f[i][j]=0;
}
bool bfs(int start, int dest)
{
q.empty();
q.push(start);
for(int i=1;i<=n;i++)
tata[i]=viz[i]=0;
viz[start]=1;
while(!q.empty())
{
int nod=q.front();
q.pop();
for(int i=0;i<g[nod].size();i++)
{
int nou=g[nod][i];
if(viz[nou]==0&&c[nod][nou]-f[nod][nou]>0)
{
viz[nou]=1;
tata[nou]=nod;
q.push(nou);
}
}
}
return viz[dest];
}
int minim(int start, int dest)
{
int nod=dest;
int Min=c[nod][tata[nod]]-f[nod][tata[nod]];
while(nod!=start)
{
int nou=tata[nod];
Min=min(Min,c[nou][nod]-f[nou][nod]);
nod=nou;
}
return Min;
}
void add(int val, int start, int dest)
{
int nod=dest;
f[nod][tata[nod]]+=val;
f[tata[nod]][nod]-=val;
while(nod!=start)
{
int nou=tata[nod];
f[nou][nod]+=val;
f[nod][nou]-=val;
nod=nou;
}
}
int calc(int start, int dest)
{
int rez=0;
while(bfs(start,dest))
for(int i=0;i<g[dest].size();i++)
{
int nod=g[dest][i];
if(c[nod][dest]==f[nod][dest]||viz[nod]==0)
continue;
int cmin=minim(start,nod);
add(cmin,start,nod);
rez+=cmin;
}
return rez;
}
bool verif(int ind)
{
int x=v[ind].x;
int y=v[ind].y;
int cost=v[ind].c;
int f1,f2;
if(x>y)
swap(x,y);
if(x==1)
f1=cost;
else f1=calc(1,x);
reinit();
if(y==n)
f2=cost;
else f2=calc(n,y);
return f1==cost&&f2==cost;
}
int main()
{
fin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y,cost;
fin>>x>>y>>cost;
v[i]={x,y,cost};
g[x].push_back(y);
g[y].push_back(x);
c[y][x]=c[x][y]=cost;
}
for(int i=1;i<=m;i++)
if(verif(i))
sol.push_back(i);
fout<<sol.size()<<'\n';
for(int i=0;i<sol.size();i++)
fout<<sol[i]<<' ';
return 0;
}