Pagini recente » Cod sursa (job #1931804) | Cod sursa (job #617011) | Cod sursa (job #3180489) | Cod sursa (job #105210) | Cod sursa (job #629563)
Cod sursa(job #629563)
#include<fstream>
using namespace std;
struct nod
{
int vecin,cost;
nod *adresa;
};
nod* vecini[30001];
int N,M,X,Y;
void adaug(int i, int j, int c)
{
nod *p;
p=new nod;
p->vecin=j;
p->cost=c;
p->adresa=vecini[i];
vecini[i]=p;
p=new nod;
p->vecin=i;
p->cost=c;
p->adresa=vecini[j];
vecini[j]=p;
}
int main()
{
int i,ii,jj,cc,viz[30001],dist[30001],nr,pr,ul,c[30001];
//dist[i]=distanta dintre X si i
nod *p;
fstream f1,f2;
f1.open("sate.in",ios::in);
f2.open("sate.out",ios::out);
for (i=0;i<=30000;i++)
vecini[i]=0;//acelasi lucru este si vecini[i]=NULL;
f1>>N>>M>>X>>Y;
for (i=0;i<=N;i++)
{
viz[i]=0;
dist[i]=20000001;
}//20000001 este un fel de infinit
for (i=1;i<=M;i++)
{
f1>>ii>>jj>>cc;
adaug(ii,jj,cc);
}
nr=1;
pr=0;
ul=0;
c[0]=X;
viz[X]=1;
dist[X]=0;
while (nr>0)
{
//primul in coada este c[pr] iar ultimul este c[ul]
//toate din coada sunt active, viz[]==1
//tot ce nu este in coada este inactiv viz[]==0
//in coada sunt nr elemente
ii=c[pr];
for (p=vecini[c[pr]];p!=0;p=p->adresa)
{
jj=p->vecin;
cc=p->cost;
if (ii<jj && dist[ii]+cc<dist[jj])
{
dist[jj]=dist[ii]+cc;
if (viz[jj]==0)
{
viz[jj]=1;
nr++;
ul++;
if (ul==N)
ul=0;
c[ul]=jj;
}
}
else
if (ii>jj && dist[ii]-cc<dist[jj])
{
dist[jj]=dist[ii]-cc;
if (viz[jj]==0)
{
viz[jj]=1;
nr++;
ul++;
if (ul==N)
ul=0;
c[ul]=jj;
}
}
}
//scoatem acum din coada pe c[pr] cu
pr++;
if (pr==N)
pr=0;
nr--;
}
f2<<dist[Y];
f1.close();
f2.close();
return 0;
}