Cod sursa(job #1326376)

Utilizator alecsandrualex cuturela alecsandru Data 25 ianuarie 2015 12:27:22
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
const int INF=0x7fffffff;
const int MAXN=2050;
const int MAXM=10050;
const int MAXK=(1<<15)+50;

struct DRUM
{
    int cost,fiu;
};
struct NOD
{
    int nod,goal;
};

int important[MAXN],cost[MAXN][MAXK];
bool inqueue[MAXN][MAXK];
vector <DRUM> drum[MAXN];
queue <NOD> q;
int main()
{
    int n,m,k,i,j;
    freopen("ubuntzei.in","r",stdin);
    freopen("ubuntzei.out","w",stdout);
    scanf("%d%d",&n,&m);
    scanf("%d",&k);
    for(i=1;i<=k;i++)
    {
        scanf("%d",&j);
        important[j]=i;
    }
    int x,y,c;
    DRUM temp;
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&c);
        temp.fiu=x;
        temp.cost=c;
        drum[y].push_back(temp);
        temp.fiu=y;
        drum[x].push_back(temp);
    }
    int lim=1<<k;
    for(i=0;i<=n;i++)
        for(j=0;j<lim;j++)
            cost[i][j]=INF;
    NOD tata,fiu;
    tata.nod=1;
    tata.goal=0;
    q.push(tata);
    inqueue[tata.nod][tata.goal]=true;
    cost[tata.nod][tata.goal]=0;
    while(!q.empty())
    {
        //printf("%d %d\n",tata.nod,tata.goal);
        tata=q.front();
        q.pop();
        inqueue[tata.nod][tata.goal]=false;
        for(i=0;i<drum[tata.nod].size();i++)
        {
            fiu.goal=tata.goal;
            fiu.nod=drum[tata.nod][i].fiu;
            if(important[fiu.nod])
            {
                fiu.goal|=1<<(important[fiu.nod]-1);
            }
            temp=drum[tata.nod][i];
            if(cost[tata.nod][tata.goal]+temp.cost<cost[fiu.nod][fiu.goal])
            {
                cost[fiu.nod][fiu.goal]=cost[tata.nod][tata.goal]+temp.cost;
                if(inqueue[fiu.nod][fiu.goal]==false)
                {
                    inqueue[fiu.nod][fiu.goal]=true;
                    q.push(fiu);
                }
            }
        }
    }
    printf("%d",cost[n][(1<<k)-1]);
    return 0;
}