Pagini recente » Cod sursa (job #2853328) | Cod sursa (job #833083) | Cod sursa (job #769295) | Cod sursa (job #2668732) | Cod sursa (job #670198)
Cod sursa(job #670198)
#include<fstream>
#include<queue>
using namespace std;
#define MAX_N 50001
#define INFINIT 100000
fstream f("ubuntzei.in",ios::in);
fstream g("ubuntzei.out",ios::out);
int n,m,nr_pr,k[MAX_N],d[MAX_N],t[MAX_N];
struct nod
{
int capat,cost;
nod *next;
}*G[MAX_N];
void add_edge(int x,int y,int c)
{
nod *p; p=new nod;
p->capat=y; p->cost=c;
p->next=G[x]; G[x]=p;
}
void read_from_file(void)
{
int i,x,y,c;
f>>n>>m>>nr_pr;
for(i=1; i<=nr_pr; i++)
f>>k[i];
for(i=1; i<=m; i++)
{
f>>x>>y>>c;
add_edge(x,y,c);
}
f.close();
}
int bellman_ford(int start)
{
int i,x,nr[MAX_N]={0};
nod *p;
queue <int> C;
for(i=2; i<=n; i++)
d[i]=INFINIT;
C.push(start);
while(!C.empty())
{
x=C.front();
C.pop();
p=G[x];
while(p)
{
if(d[x]+p->cost<d[p->capat])
{
t[p->capat]=x;
d[p->capat]=d[x]+p->cost;
C.push(p->capat);
nr[p->capat]++;
if(nr[p->capat]==n)
return 0;
}
p=p->next;
}
}
return 1;
}
void drum_minim(int nod)
{
if(t[nod])
drum_minim(t[nod]);
g<<nod<<" ";
}
void write_to_file(void)
{
if(bellman_ford(1))
drum_minim(n);
else
g<<"Eroare!Exista ciclu negativ!\n";
g.close();
}
int main()
{
read_from_file();
write_to_file();
return 0;
}