Pagini recente » Cod sursa (job #2449492) | Cod sursa (job #1038955) | Cod sursa (job #2341697) | Cod sursa (job #1390560) | Cod sursa (job #2371616)
#include <bits/stdc++.h>
#define N 5005
using namespace std;
ifstream fin("dijkstra2.in");
ofstream fout("dijkstra2.out");
int n,m,p,a[N][N],r;
int st,f;
int v[N];///nivelul fiecarui patrat
int t[N];
int task;
int ct;
bool adev=false;
int inf=200000000;
void read()
{
int i,j,x,y;
for(i=1; i<=n; ++i)
fin>>v[i];///nivelul
for(i=1; i<=n; ++i)
{
fin>>x;
for(j=1; j<=x; ++j)
{
fin>>y;
if(v[y]>v[i])
a[i][y]=v[y]/v[i];
else
a[i][y]=v[i]/v[y];
}
}
fin.close();
}
void initializare()
{
int i,j;
for(i=1; i<=n; ++i)
for(j=1; j<=n; ++j)
if(i==j)a[i][j]=0;
else a[i][j]=inf;
}
void print(int x)
{ct++;
if(t[x]!=0)
print(t[x]);
if(adev=false){fout<<ct;adev=true;}
fout<<x;
}
void dijkstra(int x)
{
int i,j,dmin,imin,k,lgmin,o;
bool s[N]= {0};
int d[N]= {0};
s[x]=1;
t[x]=0;
for(i=1; i<=n; ++i)
{d[i]=a[x][i];
if(d[i]<inf)t[i]=x;
else t[i]=0;
}
for(k=1; k<=n-1; ++k)
{
dmin=inf+1;
for(i=1; i<=n; ++i)
if(!s[i]&&d[i]<dmin)
{
dmin=d[i];
imin=i;
}
s[imin]=1;
for(i=1; i<=n; ++i)
if(!s[i]&&d[imin]+a[imin][i]<d[i])
{
d[i]=d[imin]+a[imin][i];
t[i]=imin;
}
}
if(task==1)fout<<d[f];
else print(f);
}
int main()
{
int i,j;
fin>>task>>n>>st>>f;
initializare();
read();
for(i=1; i<=n; ++i)
{for(j=1;j<=n;++j)
cout<<a[i][j]<<" ";
cout<<"\n";
}
dijkstra(st);
return 0;
}