Cod sursa(job #2524810)

Utilizator Botzki17Botocan Cristian-Alexandru Botzki17 Data 16 ianuarie 2020 12:54:38
Problema Sate Scor 15
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <fstream>
#include <queue>
#include <vector>

using namespace std;
ifstream fin("sate.in");
ofstream fout("sate.out");
const int NMAX = 30000;
int viz1[NMAX+5];
int viz2[NMAX+5];
bool viz [NMAX+5];
struct muchie
{
   int nod, cost;
};
vector <muchie> G[NMAX+5];
queue <int>q;
void bfsStart(int nod)
{
   muchie aux;
   viz1[nod] = 1;
   q.push(nod);
   while(!q.empty())
   {
     nod = q.front();
     q.pop();
    for(int i =0; i< G[nod].size(); i++)
    {
       aux = G[nod][i];
       if(viz1[aux.nod]==0)
       {
           viz1[aux.nod] = viz1[nod] + 1;
          q.push(aux.nod);
       }
    }
   }
}
void bfsStart2(int nod)
{
   muchie aux;
   viz2[nod] = 1;
   q.push(nod);
   while(!q.empty())
   {
     nod = q.front();
     q.pop();
    for(int i =0; i< G[nod].size(); i++)
    {
       aux = G[nod][i];
       if(viz2[aux.nod]==0)
       {
           viz2[aux.nod] = viz2[nod] + 1;
          q.push(aux.nod);
       }
    }
   }
}
long long bfsCost(int nod)
{
   muchie aux;
   viz1[nod] = 1;
   q.push(nod);
   long long cost =0;
   while(!q.empty())
   {
     nod = q.front();
     q.pop();
    for(int i =0; i< G[nod].size(); i++)
    {
       aux = G[nod][i];
       if(viz1[aux.nod]==0 && viz[aux.nod] ==1 )
       {
           viz1[aux.nod] = viz1[nod] + 1;
           cost = cost + aux.cost;
           q.push(aux.nod);
       }
    }
   }
   return cost;
}
int main()
{
   int n, m, x, y, c, start, finish, val, i;
   muchie aux;
   fin>>n>>m>>start>>finish;
   for(i=1;i<=m;i++)
   {
      fin>>x>>y>>c;
      aux.nod = y;
      aux.cost = c;
      G[x].push_back(aux);
      aux.nod = x;
      aux.cost = -c;
      G[y].push_back(aux);
   }
   bfsStart(start);
   val = viz1[finish];
   val++;
   bfsStart2(finish);
   for(i=1;i<=n;i++)
   {
      if(viz1[i] + viz2[i] == val)
        viz[i] = 1;
      viz1[i] = 0;
   }
   fout<<bfsCost(start)<<"\n";



    return 0;
}