TLE求助
查看原帖
TLE求助
360511
UperFicial楼主2021/11/28 20:27
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstring>
#define mem(a) memset(a,0,sizeof(a))
using namespace std;
inline int read()
{
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')s=s*10+(ch-'0'),ch=getchar();
	return s*w;
}
const int MAXN(510);
const int MAXM(4010);
int n,s,t;
int m,k;
struct E{int to,nxt,cost;};
E edge[MAXM];
struct node{int from,to,cost;};
node link[MAXM];
int head[MAXN],tot;
inline void add_edge(int u,int v,int w)
{
	edge[++tot].nxt=head[u];
	head[u]=tot;
	edge[tot].to=v;
	edge[tot].cost=w;
	return;
}
int d1[MAXN],d2[MAXN];
int par1[MAXN],par2[MAXN];
vector<int>path[MAXN];
int geton[MAXN],dist[MAXN];
int test;
typedef pair<int,int> P;
priority_queue<P,vector<P>,greater<P> >q;
inline void dijkstra(int s,int*d,int*par)
{
	for(register int i=1;i<=n;i++) d[i]=1e9;
	d[s]=0;
	q.push(make_pair(0,s));
	while(!q.empty())
	{
		P p=q.top();
		q.pop();
		int v=p.second;
		if(d[v]<p.first) continue;
		for(register int i=head[v];i;i=edge[i].nxt)
		{
			E e=edge[i];
			if(d[e.to]>d[v]+e.cost)
			{
				d[e.to]=d[v]+e.cost;
				q.push(make_pair(d[e.to],e.to));
				par[e.to]=v;
			}
		}
	}
	return;
}
int now[MAXN];
inline void init_()
{
	mem(par1);
	mem(par2);
	mem(head);
	mem(edge);
	mem(link);
	mem(now);
	tot=0;
	return;
}
inline void solve()
{
	init_();
	++test;
	m=read();
	while(m--)
	{
		int u=read(),v=read(),w=read();
		add_edge(u,v,w);
		add_edge(v,u,w);
	}
	k=read();
	for(register int i=1;i<=k;i+=2)
	{
		link[i].from=read(),link[i].to=read(),link[i].cost=read();
		link[i+1].from=link[i].to,link[i+1].to=link[i].from,link[i+1].cost=link[i].cost;
	}
	dijkstra(s,d1,par1);
	dijkstra(t,d2,par2);
	int pth=0,minn=d1[n];
	for(register int i=1;i<=(k<<1);i++)
	{
		int w=d1[link[i].from]+link[i].cost+d2[link[i].to];
		if(minn>w) minn=w,pth=i;	
	}
	if(pth==0)
	{
		int tmp=0;
		for(register int i=link[pth].from;i;i=par1[i])
		now[++tmp]=i;
		for(register int i=tmp;i>=1;i--) path[test].push_back(now[i]);
		dist[test]=d1[n];
		geton[test]=114514;
	}
	else
	{
		int tmp=0;
		for(register int i=link[pth].from;i;i=par1[i])
			now[++tmp]=i;
		for(register int i=tmp;i>=1;i--) path[test].push_back(now[i]);
		for(register int i=link[pth].to;i;i=par2[i]) path[test].push_back(i);
		dist[test]=minn;
		geton[test]=link[pth].from;
	}
	return;
}
int main()
{
	while(scanf("%d%d%d",&n,&s,&t)!=EOF) solve();
	for(register int i=1;i<=test;i++)
	{
		for(register int j=0;j<path[i].size()-1;j++) printf("%d ",path[i][j]);
		printf("%d\n",path[i][path[i].size()-1]);
		if(geton[i]==114514) puts("Ticket Not Used");
		else printf("%d\n",geton[i]);
		if(test==i) printf("%d",dist[i]);
		else printf("%d\n\n",dist[i]);
	}
	return 0;
}
2021/11/28 20:27
加载中...