Cod sursa(job #1398301)

Utilizator Consti.001FMI Dranca Constantin Consti.001 Data 24 martie 2015 09:16:32
Problema Sate Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb

#include<fstream>
#include<vector>
#include<queue>
#define INF 9999999
using namespace std;
ifstream f("sate.in");
ofstream g("sate.out");
struct muc
{
    int x;
    int c;
}s;
queue <int> p;
vector <muc> l[30001];
int n,m,x,y,i,j,d[30001],z,viz[30001];
vector <muc> q;
void merg(int x)
{
    int i=0;viz[x]=1;
    for(i=0;i<l[x].size();i++)
        if(!viz[l[x][i].x])
        {
        if(d[l[x][i].x]>d[x]+l[x][i].c)
        {
        d[l[x][i].x]=d[x]+l[x][i].c;
        }
        merg(l[x][i].x);
        if(x==y) return;
        }
}
void merg2(int x,int y)
{
    p.push(x);
    while(!p.empty())
    {
        int k=p.front();
        for(int i=0;i<l[k].size();i++)
        if(d[l[k][i].x]==d[k]-l[k][i].c)
        {
            p.push(l[k][i].x);
            if(l[k][i].x>k)
                z-=2*l[k][i].c;
        }
        p.pop();
    }
}
int main()
{
    f>>n>>m>>x>>y;
    for(i=1;i<=m;i++)
    {
        int a,b;
        f>>a>>b>>s.c;
        s.x=a;
        l[b].push_back(s);
        s.x=b;
        l[a].push_back(s);
    }
    for(i=1;i<=n;i++)
        d[i]=INF;
        d[x]=0;
        merg(x);
        z=d[y];
        merg2(y,x);
        g<<z;
    return 0;

}