Cod sursa(job #8207)

Utilizator rusRus Sergiu rus Data 23 ianuarie 2007 22:25:20
Problema Critice Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 5.57 kb
#include<stdio.h>
#include<math.h>
#include<iomanip.h>
#define dim 1001
#define dim1 10001

typedef struct nod{
        int info,ind;
        nod*urm;
        }*pnod,NOD;
pnod l[dim1];
pnod l1[dim1];

int c[dim][dim],f[dim][dim],s[dim],t[dim];
int q[dim],cr[dim];
int a[dim],b[dim],solutia[dim];
int n,m,flow;
int o[dim][dim];
int s1[dim],s2[dim];
int c2[dim];

void citire();
int flux();
int min(int ,int);
void afisare();
void dfs(int nod);
void dfd(int );
void bellmanford();
void drum();
void solve();
void add(int ,int ,int );
void add1(int ,int ,int );
int main()

{
          freopen("critice.in","r",stdin);
          freopen("critice.out","w",stdout);
          
          citire();
          bellmanford();
          solve();
          
          return 0;
}
void citire()
{
     scanf("%d %d",&n,&m);
     //printf("%d %d\n",n,m);
     int i,cost,x,y;
     for(i=1;i<=m;i++)
     {
                      scanf("%d %d %d",&x,&y,&cost);
                      c[x][y]=c[y][x]=cost;
                      add(x,y,i);
                      add(y,x,i);
                      //printf("%d %d %d\n",x[i],y[i],cost);
     }
}
void add(int i,int j,int ind)
{
     pnod p=new NOD;
     p->info=j;
     p->urm=l[i];
     p->ind=ind;
     l[i]=p;
}
void add1(int i,int j,int ind)
{
     pnod p=new NOD;
     p->info=j;
     p->ind=ind;
     p->urm=l[i];
     l[i]=p;
}
int flux()
{
    memset(s,0,sizeof(s));
    memset(t,0,sizeof(t));
    memset(cr,0,sizeof(cr));
    memset(q,0,sizeof(q));
    
    int prim,ultim,i,j;
    prim=ultim=1;
    s[1]=1;
    t[1]=0;
    cr[1]=32000;
    q[1]=1;
    while(prim<=ultim)
    {
            
        i = q[prim];
        for ( pnod p = l[i]; p; p = p->urm )
            if ( !s[p->info] )
            {
                j = p->info;
                
                if ( c[i][j] > f[i][j] )
                {   
                    if ( c[i][j] - f[i][j] < cr[i] )
                        cr[j] = c[i][j] - f[i][j];
                    else
                        cr[j] = cr[i];

                    s[j] = 1;
                    t[j] = i;
                    q[++ultim] = j;
                    if ( j == n )
                        return 1;
                }
                if ( f[j][i] > 0 )
                {
                    if ( cr[i] < f[j][i] )
                        cr[j] = cr[i];
                    else
                        cr[j] = f[j][i];

                    s[j] = 1;
                    t[j] = -i;
                    q[++ultim] = j;

                    if ( j == n )
                        return 1;
                }
            }
        prim++;
        }
    return 0;
    
}
void bellmanford()
{
     while(flux())
     drum();
}
void dfs(int nod)
{
     s1[nod]=1;
     for(pnod p=l[nod];p;p=p->urm)
     if(!s1[nod] && o[nod][p->info]!=-1)
     dfs(p->info);
}
void dfd(int nod)
{
     s2[nod]=1;
     for(pnod p=l[nod];p;p=p->urm)
     if(!s2[nod] && o[nod][p->info]!=-1)
     dfd(p->info);
}

void solve()
{
     int i,j,nre=0,x,y,nr=0,nrsol2=0;
     for(i=1;i<=n;i++)
       for(pnod p=l[i];p;p=p->urm)
       if(c[i][p->info]!=f[i][p->info])
       {
                                       add(i,p->info,1);
                                       add(p->info,i,1);
                                       //printf("%d %d\n",i,p->info);
       
       }
       else
       {
           nre++;
           add(i,p->info,-1);
           add(p->info,i,-1);
           
           o[p->info][i]=o[i][p->info]=-1;
           a[nre]=i;
           b[nre]=p->info;
           c2[nre]=p->ind;
       }
       dfs(1);
       dfd(n);
       int ind=0;
       
       for(i=1;i<=m;i++)
       {
                        x=a[i];
                        y=b[i];
                        ind=0;
                        if((s1[x]==1 && s2[y]==1)||(s1[y]==1 ||s2[x]==1))
                        ind=2;
                        if(ind==0)
                                                    
                        solutia[c2[i]]=1;
                        
                        
       }
       //printf("%d\n",nrsol2);
       for(i=1;i<=m;i++)
       if(solutia[i])
             nrsol2++;
       printf("%d\n",nrsol2);
       for(i=1;i<=m;i++)
       if(solutia[i])
       printf("%d\n",i);
}                    
void drum()
{
     int i,j;
     i=n;
     while(i)
     {
             j=abs(t[i]);
             if(t[i]>0) f[j][i]++;
             else
                        f[i][j]--;
             i=j;
	 }
     flow++;
}
void afisare()
{
     printf("%d\n",flow);
     int i,j,nrsol=0,nr1=0,nr2=0;
     
     for(i=1;i<=n;i++)
     {
                      for(j=1;j<=n;j++)
                      
                      printf("%d ",f[i][j]);
                      printf("\n");
     }
     printf("%\n");
     for(i=1;i<=n;i++)
     {
                      for(j=1;j<=n;j++)
                      
                      printf("%d ",c[i][j]);
                      printf("\n");
     }
     
     //intf("\n");
     for(i=1;i<=n;i++)
     {
                      for(j=1;j<=n;j++)
                      if(f[i][j]==c[i][j] && c[i][j]!=0)
                      {
                                          nrsol++;
                                          a[++nr1]=i;
                                          b[++nr2]=j;
                                          
                                          //printf("%d %d\n",i,j);
                      }
     }
	 //printf("%d\n",nrsol);

  
}