Cod sursa(job #666666)

Utilizator PetcuIoanPetcu Ioan Vlad PetcuIoan Data 22 ianuarie 2012 12:43:16
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.45 kb
#include<stdio.h>
#include<assert.h>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;

#define OVER9000 900000001

int n,m,t,sol=9000001,sp[10],prm[10],inprm[10],cost[50],dad[50],hue[50];
vector<pair<int,int> > a[50];

void read()
{
    assert(freopen("subarbore.in","r",stdin)!=NULL);
    int i,x,y,c;
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;++i)
    {
        scanf("%d%d%d",&x,&y,&c);
        a[x].push_back(make_pair(c,y));
        a[y].push_back(make_pair(c,x));
    }
    scanf("%d",&t);
    for(i=1;i<=t;++i)
        scanf("%d",&sp[i]);
}

void update(int x,int y)
{
    while(x!=y)
    {
        hue[x]=1;
        x=dad[x];
    }
}

void dijkstra(int x)
{
    int i,curent,val,vecin,muchie;
    priority_queue< pair<int,int>,vector <pair<int,int> >,greater <pair<int,int> > > h;
    for(i=1;i<=n;++i)
        cost[i]=OVER9000;
    cost[x]=0;
    h.push(make_pair(0,x));
    while(!h.empty())
    {
        curent=h.top().second;
        val=h.top().first;
        h.pop();
        for(i=0;i<a[curent].size();++i)
        {
            vecin=a[curent][i].second;
            muchie=a[curent][i].first;
            if(muchie+val<cost[vecin])
            {
                cost[vecin]=muchie+val;
                dad[vecin]=curent;
                h.push(make_pair(cost[vecin],vecin));
            }
        }
    }
}

void v_r_fight()
{
    int i,j,te=0,k,noduri[10];
    vector<pair<int,int> > b[50];
    for(i=1;i<=n;++i)
        for(j=0;j<=a[i].size();++j)
            b[i].push_back(a[i][j]);
    for(i=1;i<=t;++i)
        noduri[i]=sp[prm[i]];
    for(i=1;i<t;++i)
    {
        for(j=1;j<=n;++j)
            if(hue[j])
                for(k=0;k<a[j].size();++k)
                    if(hue[a[i][j].second])// GET 666666
                        a[i][j].first=0;
        hue[noduri[i]]=1;
        dijkstra(noduri[i]);
        te+=cost[noduri[i+1]];
        update(noduri[i+1],noduri[i]);
    }
    for(i=1;i<=n;++i)
        hue[i]=dad[i]=0;
    for(i=1;i<=n;++i)
        for(j=0;j<=a[i].size();++j)
            a[i][j]=b[i][j];
    sol=min(sol,te);
}

void solve(int k)
{
    int i;
    if(k==t+1)
    {
        v_r_fight();
        return;
    }
    for(i=1;i<=t;++i)
        if(!inprm[i])
        {
            prm[k]=i;
            inprm[i]=1;
            solve(k+1);
            inprm[i]=0;
        }
}

void write()
{
    assert(freopen("subarbore.out","w",stdout)!=NULL);
    printf("%d",sol);
}

int main()
{
    read();
    solve(1);
    write();
    return 0;
}