Cod sursa(job #903581)

Utilizator stefan.cStefan Cucea stefan.c Data 1 martie 2013 22:48:21
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include<stdio.h>
#include<vector>
#include<queue>
using namespace std;
vector<int> v[5001],cost[5001];
queue<int> q;
int n,m,k,nroper=0,prieteni[20],dist[5001],lovit[5002],inq[5002], partiale[20][20],distantefinale[20];

void bellman(int start){
    int x,i;
    q.push(start);
    x=start;
    nroper++;
    dist[start]=0;
    lovit[start]=nroper;

    while(!q.empty()){
        x=q.front();
        q.pop();
        for(i=0;i<v[x].size();i++){

            if(dist[v[x][i]] > dist[x] + cost[x][i] || lovit[v[x][i]]!= nroper){

                dist[v[x][i]] = dist[x] + cost[x][i];
                lovit[v[x][i]]=nroper;

                if(inq[v[x][i]]!=nroper){
                    q.push(v[x][i]);
                    inq[v[x][i]]++;
                }
            }
        }
        inq[x]=0;
    }
distantefinale[nroper]=dist[n];
for(i=1;i<=k;i++)
  partiale[nroper][i]=dist[prieteni[i]];
}

int main()
{int i,a,b,c;
    freopen("ubuntzei.in","r",stdin);
    freopen("ubuntzei.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
for(i=1;i<=k;i++)
    scanf("%d",&prieteni[i]);
for(i=1;i<=m;i++){
  scanf("%d%d%d",&a,&b,&c);
  v[a].push_back(b);
  v[b].push_back(a);
  cost[a].push_back(c);
  cost[b].push_back(c);
}
for(i=2;i<=n;i++)
   dist[i]=2000000000;

bellman(1);

if(k==0)
  printf("%d",dist[n]);
else
{
    for(i=1;i<=k;i++)
       bellman(prieteni[i]);

}



return 0;
}