Cod sursa(job #1814377)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 23 noiembrie 2016 22:03:07
Problema Sate Scor 100
Compilator cpp Status done
Runda cerculdeinfo-lectia7-grafuri Marime 1.79 kb
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <algorithm>

#define BUF_SIZE 1<<17
char buf[BUF_SIZE];
int pbuf=BUF_SIZE;
FILE*fi,*fo;
inline char nextch(){
    if(pbuf==BUF_SIZE){
        fread(buf, BUF_SIZE, 1, fi);
        pbuf=0;
    }
    return buf[pbuf++];
}
inline long long nextnum(){
    long long a=0;
    char c=nextch();
    while((c<'0' || c>'9') && c!='-')
        c=nextch();
    int semn=1;
    if(c=='-'){
        semn=-1;
        c=nextch();
    }
    while('0'<=c && c<='9'){
        a=a*10+c-'0';
        c=nextch();
    }
    return a*semn;
}

#define MAXN 30000
#define MAXQ 65535

struct Edge{
    int node;
    int cost;
};
std::vector <Edge> G[1+MAXN];
int q[MAXQ];
int dist[1+MAXN];
int inq[1+MAXN];

int main(){
    fi=fopen("sate.in","r");
    fo=fopen("sate.out","w");
    int n=nextnum(), m=nextnum();
    int a=nextnum(), b=nextnum();
    for(int i=0;i<m;i++){
        Edge temp;
        int x=nextnum(), y=nextnum();
        temp.node=y;
        temp.cost=nextnum();
        G[x].push_back(temp);
        temp.node=x;
        G[y].push_back(temp);
    }
    for(int i=1;i<=n;i++)
        dist[i]=1000000000;
    int p=0, u=1;
    q[0]=a;
    dist[a]=0;
    inq[a]=1;
    while(p!=u){
        int node=q[p];
        for(int i=0;i<G[node].size();i++){
            if(!inq[G[node][i].node]){
                if(G[node][i].node<node)
                    dist[G[node][i].node]=dist[node]-G[node][i].cost;
                else
                    dist[G[node][i].node]=dist[node]+G[node][i].cost;
                inq[G[node][i].node]=1;
                q[u++]=G[node][i].node;
            }
        }
        p++;
    }
    fprintf(fo,"%d", dist[b]);
    fclose(fi);
    fclose(fo);
    return 0;
}