7-15 天梯地图 (30 分)

传送门

#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;
}

猜你喜欢

转载自blog.csdn.net/henucm/article/details/87810717