Pagini recente » Cod sursa (job #1083385) | Cod sursa (job #793766) | Cod sursa (job #420329) | Cod sursa (job #1801166) | Cod sursa (job #900396)
Cod sursa(job #900396)
#include <stdio.h>
#include <queue>
#include <vector>
#define NMAX 30002
using namespace std;
//ifstream fin("sate.in");
//ofstream fout("sate.out");
FILE *fin,*fout;
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,"%d%d%d%d",&n,&m,&s,&f);
//fin>>n>>m>>s>>f;
for(i=1;i<=m;i++)
{
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];
}