Cod sursa(job #2323080)

Utilizator usureluflorianUsurelu Florian-Robert usureluflorian Data 18 ianuarie 2019 19:51:10
Problema Parantezare optima de matrici Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f ("retea.in");
ofstream g ("retea.out");
const int nmax=1e3+3;
int n,m,k,a,b,nod;
bool viz[nmax][13];
double act,cost,d[nmax][13];
struct gioto
{
    double cost;
    int nod,k;
    inline bool operator < (const gioto &t) const
    {
        return t.cost<cost;
    }
};
priority_queue <gioto> q;
priority_queue <double> usu;
vector <int> v[nmax];
vector <double> c[nmax];
int main()
{
    ios::sync_with_stdio(false);
    f>>n>>m>>k;
    while(m--)
    {
        f>>a>>b>>cost;
        v[a].push_back(b);
        v[b].push_back(a);
        c[a].push_back(cost);
        c[b].push_back(cost);
    }
    for(int i=1;i<=n;++i)
    {
        for(int j=0;j<=k;++j) d[i][j]=1e9;
    }
    d[1][0]=0;
    q.push({0,1,0});
    while(!q.empty())
    {
        nod=q.top().nod;
        cost=q.top().cost;
        int kk=q.top().k;
        q.pop();
        if(viz[nod][kk]) continue;
        viz[nod][kk]=1;
        for(int i=0;i<v[nod].size();++i)
        {
            double tata=c[nod][i];
            for(int j=kk;j<=k;++j)
            {
                if(cost+tata<d[v[nod][i]][j])
                {
                    d[v[nod][i]][j]=cost+tata;
                    q.push({d[v[nod][i]][j],v[nod][i],j});
                }
                tata/=2.0;
            }
        }
    }
    g<<fixed<<setprecision(7)<<d[n][k];
    return 0;
}