Pagini recente » Cod sursa (job #1309047) | Cod sursa (job #1472668) | Cod sursa (job #116767) | Cod sursa (job #502812) | Cod sursa (job #638727)
Cod sursa(job #638727)
#include <iostream>
#include <fstream>
#include <vector>
#define N 51000
#define M 251000
using namespace std;
ifstream in("dijkstra.in");
ofstream out("dijkstra.out");
vector <int> a[N],b[N];
int minim[N],st[M],dr[M],cost[M],poz[M],h[M];
int ok[M];
void swap(int a,int b)
{
int c=h[a];
h[a]=h[b];
h[b]=c;
poz[h[a]]=a;
poz[h[b]]=b;
}
void urca(int p)
{
while(p!=1 && minim[st[h[p]]]+cost[h[p]]<minim[st[h[p/2]]]+cost[h[p/2]])
{
swap(p,p/2);
p=p/2;
}
}
void coboara(int p)
{
int ps=p;
if(p*2<=h[0] && minim[st[h[ps]]]+cost[h[ps]]>minim[st[h[p*2]]]+cost[h[p*2]])
ps=p*2;
if(p*2+1<=h[0] && minim[st[h[ps]]]+cost[h[ps]]>minim[st[h[p*2+1]]]+cost[h[p*2+1]])
ps=p*2+1;
if(ps!=p)
{
swap(ps,p);
coboara(ps);
}
}
void baga(int x)
{
h[++h[0]]=x;
poz[x]=h[0];
urca(h[0]);
}
void scoate(int x)
{
h[poz[x]]=h[h[0]];
poz[h[h[0]]]=poz[x];
h[0]--;
urca(poz[x]);
coboara(poz[x]);
}
int main()
{
int n,m,i,x,j;
in>>n>>m;
for(i=1;i<=m;++i)
{
in>>st[i]>>dr[i]>>cost[i];
a[st[i]].push_back(i);
b[dr[i]].push_back(i);
}
for(i=2;i<=n;i++)
in>>ok[i];
for(i=1;i<=n;++i)
{
minim[i]=-1;
}
for(i=0;i<a[1].size();++i)
{
baga(a[1][i]);
}
minim[1]=0;
for(i=2;i<=n;++i)
{
if (h[0]==0) break;
x=h[1];
//out<<" "<<st[x]<<" "<<dr[x]<<" "<<cost[x]<<" ";
minim[dr[x]]=minim[st[x]]+cost[x];
//out<<minim[st[x]]<<" "<<minim[dr[x]]<<" "<<ok[dr[x]]<<" \n";
//for(j=1;j<h[0];j++)
// out<<cost[h[j]]<<" ";
//out<<"\n";
for(j=0;j<b[dr[x]].size();++j)
{
if(poz[b[dr[x]][j]])
{
scoate(b[dr[x]][j]);
poz[b[dr[x]][j]]=0;
}
}
for(j=0;j<a[dr[x]].size();++j)
{
if(minim[dr[a[dr[x]][j]]]==-1)
baga(a[dr[x]][j]);
}
}
for(i=2;i<=n;++i)
{
if (minim[i]==-1)
out<<"0 ";
else
out<<minim[i]<<" ";
}
return 0;
}