Pagini recente » Cod sursa (job #1119616) | Cod sursa (job #520425) | Cod sursa (job #3156763) | Cod sursa (job #2434170) | Cod sursa (job #886749)
Cod sursa(job #886749)
#include <fstream>
#include <vector>
#include <algorithm>
#define nmax 1050
#define f first
#define s second
using namespace std;
ifstream f("pitici.in");
ofstream g("pitici.out");
vector < pair<int,int> > vec[nmax],vect[nmax],h;
vector <int> v;
int n,d[nmax][nmax],viz[nmax],mu[nmax];
void toposort(int nod)
{
int i,x;
viz[nod]=1;
for(i=0;i<vec[nod].size();i++)
{
x=vec[nod][i].first;
if(!viz[x])
toposort(x);
}
v.push_back(nod);
}
void sift(int nod)
{
int son=nod,s1,s2;
do
{
nod=son; s1=2*nod; s2=2*nod+1;
if(s1<h.size() && d[h[son].f][h[son].s]+mu[h[son].f]>d[h[s1].f][h[s1].s]+mu[h[s1].f]) son=s1;
if(s2<h.size() && d[h[son].f][h[son].s]+mu[h[son].f]>d[h[s2].f][h[s2].s]+mu[h[s2].f]) son=s2;
swap(h[nod],h[son]);
}while(nod!=son);
}
void percolate(int nod)
{
while(d[h[nod].f][h[nod].s]+mu[h[nod].f]<d[h[nod/2].f][h[nod/2].s]+mu[h[nod/2].f])
{
swap(h[nod],h[nod/2]);
nod=nod/2;
}
}
void adaugare(int x,int y)
{
if(d[x][y] || (x==1 && y==1))
{
h.push_back(make_pair(x,y));
percolate(h.size()-1);
}
}
int main()
{
int m,i,j,x,y,c,nod,k;
f>>n>>m>>k;
for(i=0;i<m;i++)
{
f>>x>>y>>c;
vec[x].push_back(make_pair(y,c));
vect[y].push_back(make_pair(x,c));
}
toposort(1);
reverse(v.begin(),v.end());
d[1][1]=0;
for(i=1;i<n;i++)
{
h.clear();
h.push_back(make_pair(0,0));
nod=v[i];
for(j=0;j<vect[nod].size();j++)
{
mu[vect[nod][j].first]=vect[nod][j].second;
adaugare(vect[nod][j].first,1);
}
for(j=1;j<=k && h.size()>1 ;j++)
{
if(h.size()>1)
{
x=h[1].f;
y=h[1].s;
d[nod][j]=d[x][y]+mu[x];
h[1]=h[h.size()-1];
h.pop_back();
sift(1);
adaugare(x,y+1);
}
}
}
for(j=1;j<=k;j++)
g<<d[n][j]<<' ';
}