#include <bits/stdc++.h>
#define int long long
//#pragma GCC optimize(2)
//#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
const int inf=1e9+5;
const int maxn=505;
int s,t;
struct edge
{
int v,next;
int l,t;
};
edge no[maxn*maxn];
int head[maxn];
int cnt;
int dis[maxn];
int vis[maxn];
int sec[maxn];
int th[maxn];
int pre[maxn];
vector<int>uu,vv;
int L,T;
struct node
{
int dis;
int x;
bool operator <(const node & no)const
{
return dis>no.dis;
}
};
priority_queue<node>q;
void init()
{
cnt=1;
uu.clear();
vv.clear();
memset(head,0,sizeof(head));
}
void add(int x,int y,int l,int t)
{
no[cnt].v=y;
no[cnt].t=t;
no[cnt].l=l;
no[cnt].next=head[x];
head[x]=cnt;
cnt++;
}
void dijstrat(int s)
{
while(!q.empty())
q.pop();
for(int i=0;i<maxn;i++)
{
dis[i]=inf;
sec[i]=inf;
th[i]=inf;
}
memset(vis,0,sizeof(vis));
memset(pre,-1,sizeof(pre));
dis[s]=0;
sec[s]=0;
th[s]=0;
q.push({0,s});
while(!q.empty())
{
node uu=q.top();
int u=uu.x;
if(u==t)
break;
q.pop();
if(vis[u])
continue;
vis[u]=1;
for(int i=head[u];i;i=no[i].next)
{
int v=no[i].v;
if(dis[v]>dis[u]+no[i].t)
{
dis[v]=dis[u]+no[i].t;
sec[v]=sec[u]+no[i].l;
th[v]=th[u]+1;
pre[v]=u;
q.push({dis[v],v});
}
else if(dis[v]==dis[u]+no[i].t&&sec[v]>sec[u]+no[i].l)
{
sec[v]=sec[u]+no[i].l;
th[v]=th[u]+1;
pre[v]=u;
q.push({dis[v],v});
}
else if(dis[v]==dis[u]+no[i].t&&sec[v]==sec[u]+no[i].l&&th[v]>th[u]+1)
{
th[v]=th[u]+1;
pre[v]=u;
q.push({dis[v],v});
}
}
}
for(int i=t;i!=s;i=pre[i])
{
uu.push_back(i);
}
uu.push_back(s);
T=dis[t];
}
void dijstral(int s)
{
while(!q.empty())
q.pop();
for(int i=0;i<maxn;i++)
{
dis[i]=inf;
sec[i]=inf;
vis[i]=0;
pre[i]=-1;
}
dis[s]=0;
sec[s]=0;
q.push({dis[s],s});
while(!q.empty())
{
node uu=q.top();
int u=uu.x;
if(u==t)
break;
q.pop();
if(vis[u])
continue;
vis[u]=1;
for(int i=head[u];i;i=no[i].next)
{
int v=no[i].v;
if(dis[v]>dis[u]+no[i].l)
{
dis[v]=dis[u]+no[i].l;
sec[v]=sec[v]+1;
pre[v]=u;
q.push({dis[v],v});
}
else if(dis[v]==dis[u]+no[i].l&&sec[v]>sec[u]+1)
{
sec[v]=sec[v]+1;
pre[v]=u;
q.push({dis[v],v});
}
}
}
for(int i=t;i!=s;i=pre[i])
{
vv.push_back(i);
}
vv.push_back(s);
L=dis[t];
}
void solve()
{
init();
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int op,a,b,l,t;
cin>>a>>b>>op>>l>>t;
add(a,b,l,t);
if(op==0)
add(b,a,l,t);
}
cin>>s>>t;
dijstrat(s);
dijstral(s);
int flag=1;
if(vv.size()==uu.size())
{
for(int i=0;i<uu.size();i++)
{
if(uu[i]!=vv[i])
{
flag=0;
break;
}
}
}
else
flag=0;
if(flag==1)
{
cout<<"Time = "<<T<<"; Distance = "<<L<<": ";
for(int i=uu.size()-1;i>=0;i--)
{
if(i!=uu.size()-1)
{
cout<<" => ";
}
cout<<uu[i];
}
cout<<endl;
}
else
{
cout<<"Time = "<<T<<": ";
for(int i=uu.size()-1;i>=0;i--)
{
if(i!=uu.size()-1)
{
cout<<" => ";
}
cout<<uu[i];
}
cout<<endl;
cout<<"Distance = "<<L<<": ";
for(int i=vv.size()-1;i>=0;i--)
{
if(i!=vv.size()-1)
{
cout<<" => ";
}
cout<<vv[i];
}
cout<<endl;
}
}
signed main() {
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int _=1;
while(_--) {
solve();
}
return 0;
}
最短路
最新推荐文章于 2024-05-23 13:01:48 发布