Pagini recente » Cod sursa (job #2102767) | Cod sursa (job #1307000) | Cod sursa (job #930947) | Cod sursa (job #1702486) | Cod sursa (job #2452898)
#include <iostream>
#include <fstream>
#include <vector>
#include <functional>
#include <queue>
using namespace std;
ifstream intrare("ubuntzei.in");
ofstream iesire("ubuntzei.out");
const int NMAX=2005,oo=(1<<30);
int dist2[NMAX];
vector < pair < int , int > >graf[NMAX];
priority_queue < int , vector < int > , greater < int > >c;
int graf2[4][NMAX];
int i,j,n,m,p,k,dist[NMAX][NMAX],prieteni[NMAX];
bool vizitat[NMAX];
void Dijkstra(int x, int avoid,int avoid2)
{
for(i=1; i<=n; i++)
{
dist[x][i]=oo;
vizitat[i]=0;
}
c.push(x);
vizitat[x]=true;
dist[x][x]=0;
while(!c.empty())
{
int nod=c.top();
c.pop();
vizitat[nod]=false;
for(size_t i=0; i<graf[nod].size(); i++)
{
int vecin=graf[nod][i].first;
int cost=graf[nod][i].second;
int costnou=dist[x][nod]+cost;
if(costnou<dist[x][vecin] && vecin!=avoid && vecin!=avoid2)
{
dist[x][vecin]=costnou;
if(!vizitat[vecin])
{
c.push(vecin);
vizitat[vecin]=true;
}
}
}
}
}
void schimba(int &x,int &y)
{
x=x^y;
y=y^x;
x=x^y;
}
int main()
{
intrare>>n>>m;
intrare>>k;
for(i=1; i<=k; i++)
intrare>>prieteni[i];
for(i=1; i<=m; i++)
{
int a,b,c;
intrare>>a>>b>>c;
graf[a].push_back(make_pair(b,c));
graf[b].push_back(make_pair(a,c));
}
if(k!=0)
{
for(j=1; j<=k; j++)
Dijkstra(prieteni[j],n,1);
Dijkstra(1,n,0);
Dijkstra(n,1,0);
for(i=1; i<=k; i++)
{
graf2[1][i]=1;
graf2[2][i]=prieteni[i];
graf2[3][i]=dist[1][prieteni[i]];
}
int l=1;
for(i=k+1; i<=2*k; i++)
{
graf2[1][i]=n;
graf2[2][i]=prieteni[l];
graf2[3][i]=dist[n][prieteni[l++]];
}
i=2*k+1;
for(j=1; j<=k; j++)
for(int g=1; g<=k; g++)
{
if(j!=g)
{
graf2[1][i]=prieteni[j];
graf2[2][i]=prieteni[g];
graf2[3][i]=dist[prieteni[j]][prieteni[g]];
i++;
}
}
int total=(2*k)+(k*k)-k;
int xx=0;
do
{
xx=0;
for(i=1; i<=total-1; i++)
if(graf2[3][i]>graf2[3][i+1])
{
schimba(graf2[1][i],graf2[1][i+1]);
schimba(graf2[2][i],graf2[2][i+1]);
schimba(graf2[3][i],graf2[3][i+1]);
xx=1;
}
}
while(xx==1);
for(i=1;i<=total;i++)
cout<<graf2[1][i]<<" "<<graf2[2][i]<<" "<<graf2[3][i]<<endl;
int s[k+3];
s[1]=1;
s[n]=n;
for(i=1; i<=k; i++)
s[prieteni[i]]=prieteni[i];
prieteni[0]=1;
prieteni[k+1]=n;
//for(i=0;i<=k+1;i++)
// cout<<prieteni[i]<<" ";
int h=0;
int i=1;
int cost=0;
while(h<(k+1))
{
if(s[graf2[1][i]]!=s[graf2[2][i]] )
{
cost+=graf2[3][i];
h++;
int co1=s[graf2[1][i]];
int co2=s[graf2[2][i]];
for(j=0; j<=k+1; j++)
if(s[prieteni[j]]==co2)
s[prieteni[j]]=co1;
}
i++;
}
//for(i=0;i<=k+1;i++)
// cout<<s[prieteni[i]]<<endl;
iesire<<cost;
}
else
{
Dijkstra(1,0,0);
iesire<<dist[1][n];
}
return 0;
}