#include <string.h>
#include <stdio.h>
#include <vector>
#include <queue>
#include <algorithm>
#include <map>
#include <string>
#include <iostream>
#include <math.h>
using namespace std;
const int inf=100000000000;
int T[510][510];
int L[510][510];
bool vis[510];
int d[510];
vector<int> pre[510];
int N,M,st,ed;
void DijT(int st)
{
memset(vis,false,sizeof(vis));
fill(d,d+510,inf);
d[st]=0;
for(int i=0;i<N;i++)
{
int u=-1,MIN=inf;
for(int j=0;j<N;j++)
{
if(d[j]<MIN&&vis[j]==false)
{
u=j;
MIN=d[j];
}
}
vis[u]=true;
for(int v=0;v<N;v++)
{
if(vis[v]==false&&T[u][v]<inf)
{
if(d[u]+T[u][v]<d[v])
{
d[v]=d[u]+T[u][v];
pre[v].clear();
pre[v].push_back(u);
}
else if(d[u]+T[u][v]==d[v])
{
pre[v].push_back(u);
}
}
}
}
}
void DijL(int st)
{
memset(vis,false,sizeof(vis));
fill(d,d+510,inf);
d[st]=0;
for(int i=0;i<N;i++)
{
int u=-1,MIN=inf;
for(int j=0;j<N;j++)
{
if(d[j]<MIN&&vis[j]==false)
{
u=j;
MIN=d[j];
}
}
vis[u]=true;
for(int v=0;v<N;v++)
{
if(vis[v]==false&&L[u][v]<inf)
{
if(d[u]+L[u][v]<d[v])
{
d[v]=d[u]+L[u][v];
pre[v].clear();
pre[v].push_back(u);
}
else if(d[u]+L[u][v]==d[v])
{
pre[v].push_back(u);
}
}
}
}
}
vector<int> temppath,pathT,pathL;
void DFST(int now)
{
if(now==st)
{
temppath.push_back(now);
if(pathT.size()==0)
{
pathT=temppath;
}
else if(temppath.size()<pathT.size())
{
pathT=temppath;
}
temppath.pop_back();
return;
}
temppath.push_back(now);
for(int i=0;i<pre[now].size();i++)
{
DFST(pre[now][i]);
}
temppath.pop_back();
}
int mintime=inf;
void DFSL(int now)
{
if(now==st)
{
temppath.push_back(now);
int temptime=0;
for(int i=temppath.size()-2;i>=0;i--)
{
int c1=temppath[i+1];
int c2=temppath[i];
temptime+=T[c1][c2];
}
if(temptime<mintime)
{
pathL=temppath;
mintime=temptime;
}
temppath.pop_back();
return;
}
temppath.push_back(now);
for(int i=0;i<pre[now].size();i++)
{
DFSL(pre[now][i]);
}
temppath.pop_back();
}
int main()
{
fill(T[0],T[0]+510*510,inf);
fill(L[0],L[0]+510*510,inf);
scanf("%d%d",&N,&M);
for(int i=0;i<M;i++)
{
int c1,c2,oneway,l,t;
scanf("%d%d%d%d%d",&c1,&c2,&oneway,&l,&t);
L[c1][c2]=l;
T[c1][c2]=t;
if(oneway==0)
{
L[c2][c1]=l;
T[c2][c1]=t;
}
}
scanf("%d%d",&st,&ed);
DijT(st);
DFST(ed);
int rt=d[ed];
temppath.clear();
DijL(st);
DFSL(ed);
int rl=d[ed];
if(pathT==pathL)
{
printf("Distance = %d; Time = %d: ",rl,rt);
for(int i=pathL.size()-1;i>=0;i--)
{
if(i!=pathL.size()-1)printf(" -> ");
printf("%d",pathL[i]);
}
}
else
{
printf("Distance = %d: ",rl);
for(int i=pathL.size()-1;i>=0;i--)
{
if(i!=pathL.size()-1)printf(" -> ");
printf("%d",pathL[i]);
}
printf("\n");
printf("Time = %d: ",rt);
for(int i=pathT.size()-1;i>=0;i--)
{
if(i!=pathT.size()-1)printf(" -> ");
printf("%d",pathT[i]);
}
printf("\n");
}
return 0;
}
PAT甲1111 Online Map(30 分)
最新推荐文章于 2021-03-11 12:00:29 发布