#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#include<stack>
#define ll long long
#define N 0x3f3f3f3f
using namespace std;
int f1[501],f2[501],ti[501][501],co[501][501];
int x,y,z,d,t,cnt[501],s,e,n,m,i,j;
int vis[501];
int ss[501];
int sss[501];
int tt[501];
void dijsktra1(int x)
{
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
{
ss[i]=N;
}
ss[x]=0;
for(int i=0;i<n;i++)
{
int u=-1;
int minn=N;
for(int j=0;j<n;j++)
{
if(!vis[j]&&minn>ss[j])
{
u=j;
minn=ss[j];
}
}
if(u==-1)
break;
vis[u]=1;
for(int j=0;j<n;j++)
{
if(!vis[j]&&ss[j]>ss[u]+co[u][j])
{
cnt[j]=cnt[u]+1;
ss[j]=ss[u]+co[u][j];
f1[j]=u;
}
else if(!vis[j]&&ss[j]==ss[u]+co[u][j])
{
if(cnt[j]>cnt[u]+1)
{
f1[j]=u;
cnt[j]=cnt[u]+1;
}
}
}
}
}
void dijsktra2(int x)
{
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
{
sss[i]=N;
}
sss[x]=0;
for(int i=0;i<n;i++)
{
int u=-1;
int minn=N;
for(int j=0;j<n;j++)
{
if(!vis[j]&&minn>sss[j])
{
u=j;
minn=sss[j];
}
}
if(u==-1)
break;
vis[u]=1;
for(int j=0;j<n;j++)
{
if(!vis[j]&&sss[j]>sss[u]+ti[u][j])
{
sss[j]=sss[u]+ti[u][j];
ss[j]=ss[u]+co[u][j];
f2[j]=u;
}
else if(!vis[j]&&sss[j]==sss[u]+ti[u][j])
{
if(ss[j]>ss[u]+co[u][j])
{
f2[j]=u;
ss[j]=ss[u]+co[u][j];
}
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
cnt[i]=1;
for(int j=0;j<n;j++)
{
ti[i][j]=N;
co[i][j]=N;
}
}
for(int i=1;i<=m;i++)
{
cin>>x>>y>>z>>d>>t;
if(z==1)
{
ti[x][y]=t;
co[x][y]=d;
}
else
{
ti[x][y]=ti[y][x]=t;
co[x][y]=co[y][x]=d;
}
}
cin>>s>>e;
dijsktra1(s);
stack<int>ss1,ss2;
int k1=e;
ss1.push(k1);
int len1=ss[e];
while(f1[k1]!=s)//一开始我写的是 !=0 发现总是多输出一次起点 然后就想着输出前T出一个 就行了
//发现有两个样例过不了。。好迷啊
{
ss1.push(f1[k1]);
k1=f1[k1];
}
memset(vis,0,sizeof(vis));
dijsktra2(s);
int k2=e;
int len2=sss[e];
ss2.push(k2);
while(f2[k2]!=s)//同上
{
ss2.push(f2[k2]);
k2=f2[k2];
}
if(ss1==ss2)
{
printf("Time = %d; Distance = %d: %d",len2,len1,s);
while(!ss1.empty())
{
printf(" => %d",ss1.top());
ss1.pop();
}
}
else
{
printf("Time = %d: %d",len2,s);
while(!ss2.empty())
{
printf(" => %d",ss2.top());
ss2.pop();
}
puts("");
printf("Distance = %d: %d",len1,s);
while(!ss1.empty())
{
printf(" => %d",ss1.top());
ss1.pop();
}
}
return 0;
}
7-15 天梯地图 (30 分)
猜你喜欢
转载自blog.csdn.net/henucm/article/details/87810717
今日推荐
周排行