Cod sursa(job #1060261)

Utilizator robert.onesimRobert Onesim robert.onesim Data 17 decembrie 2013 19:55:24
Problema Sate Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 2.66 kb
#include <stdio.h>
#include <fstream>
#include <queue>
#include <vector>
#define NMAX 30002
using namespace std;

ifstream fin("sate.in");
//ofstream fout("sate.out");
FILE *fout;
#define DIM 10000
char buff[DIM];
int poz=0;
void bfs();
void citire();
struct muchie{int vf,cost;};
vector <muchie> L[NMAX];
queue <int> C;
int dmin[NMAX],viz[NMAX],s,f,n,m;
int main()
{
    citire();
    bfs();
}
void citire()
{
    //fin=fopen("sate.in","r");
    fout=fopen("sate.out","w");
    int i,c,x,y;
    muchie aux;
//    fscanf(fin,"%s",&buff);
    fin.getline(buff,DIM);
    poz=0;
    while(buff[poz]>='0'&&buff[poz]<='9') {n=n*10+buff[poz]-'0'; poz++;} poz++;
    while(buff[poz]>='0'&&buff[poz]<='9') {m=m*10+buff[poz]-'0'; poz++;} poz++;
    while(buff[poz]>='0'&&buff[poz]<='9') {s=s*10+buff[poz]-'0'; poz++;} poz++;
    while(buff[poz]>='0'&&buff[poz]<='9') {f=f*10+buff[poz]-'0'; poz++;} poz++;

    //fscanf(fin,"%d%d%d%d",&n,&m,&s,&f);
    //fin>>n>>m>>s>>f;
    for(i=1;i<=m;i++)
    {
        poz=0;x=0;y=0;c=0;
        fin.getline(buff,DIM);
        while(buff[poz]>='0'&&buff[poz]<='9') {x=x*10+buff[poz]-'0'; poz++;} poz++;
        while(buff[poz]>='0'&&buff[poz]<='9') {y=y*10+buff[poz]-'0'; poz++;} poz++;
        while(buff[poz]>='0'&&buff[poz]<='9') {c=c*10+buff[poz]-'0'; poz++;} poz++;
        //fscanf(fin,"%d%d%d",&x,&y,&c);
        aux.vf=y;aux.cost=c;
        L[x].push_back(aux);
        aux.vf=x;
        L[y].push_back(aux);
    }
}
void bfs()
{
    int i,j,vfmin;
    viz[s]=1;
    for(i=0;i<L[s].size();i++)
    {
        dmin[L[s][i].vf]=L[s][i].cost;  C.push(L[s][i].vf);
        viz[L[s][i].vf]=1;
    }
    while(!C.empty())
    {
        vfmin=C.front(); C.pop();
        for(j=0;j<L[vfmin].size();j++)
        {
            if(s<vfmin && vfmin<L[vfmin][j].vf) dmin[L[vfmin][j].vf]=dmin[vfmin]+L[vfmin][j].cost;
            if(s<L[vfmin][j].vf && L[vfmin][j].vf<vfmin) dmin[L[vfmin][j].vf]=dmin[vfmin]-L[vfmin][j].cost;
            if(vfmin<s && L[vfmin][j].vf>s) dmin[L[vfmin][j].vf]=L[vfmin][j].cost-dmin[vfmin];
            if(vfmin<L[vfmin][j].vf && s>L[vfmin][j].vf) dmin[L[vfmin][j].vf]=-L[vfmin][j].cost+dmin[vfmin];
            if(L[vfmin][j].vf<s && s<vfmin ) dmin[L[vfmin][j].vf]=L[vfmin][j].cost-dmin[vfmin];
            if(L[vfmin][j].vf<vfmin && vfmin<s ) dmin[L[vfmin][j].vf]=L[vfmin][j].cost+dmin[vfmin];
            if(viz[L[vfmin][j].vf]==0)
            {
                C.push(L[vfmin][j].vf);
                viz[L[vfmin][j].vf]=1;
            }
        }
     }
     if(dmin[f]==0) fprintf(fout,"-1");
     //fout<<-1;
     else fprintf(fout,"%d",dmin[f]);
         //fout<<dmin[f];
}