10分求调(炸了)
查看原帖
10分求调(炸了)
950498
Base_ring_tree楼主2024/5/25 09:39
#include<bits/stdc++.h>
using namespace std;
#define int long long
int head[100005],vis[100005];
int dis[200005],dis2[200005];
int n,m,k,tot=0;
struct node{
	int to,nxt,d;
}edge[100005];
struct point{
	int dd,p;
	bool operator<(const point & x) const{
		return dd>x.dd;
	}
};
void add(int x,int y,int z)
{
	edge[tot].to=y;
	edge[tot].d=z;
	edge[tot].nxt=head[x];
	head[x]=tot++;
}
void dijkstra()
{
	for(int i=1;i<=n;i++)
	{
		dis[i]=1e18;
		dis2[i]=1e18;
	}
	dis[1]=0;
	memset(vis,0,sizeof(vis));
	priority_queue<point> q;
	point a;
	a.dd=0;
	a.p=k;
	q.push(a);
	while(!q.empty())
	{
		a=q.top();
		q.pop();
		int x=a.p;
		if(a.dd>dis2[x])
		{
			continue;
		}
		for(int i=head[x];i!=-1;i=edge[i].nxt)
		{
			int y=edge[i].to;
			if(dis[y]>dis[x]+edge[i].d)
		   {
		   	    dis2[y]=dis[y];
		   	    dis[y]=dis[x]+edge[i].d;
		   	    a.dd=dis[y];
		   	    a.p=y;
		   	    q.push(a);
		   }
		   if(dis2[y]>dis[x]+edge[i].d&&dis[y]<dis[x]+edge[i].d)
		   {
		   	    dis2[y]=dis[x]+edge[i].d;
		   	    a.dd=dis2[y];
		   	    a.p=y;
		   	    q.push(a);
		   }
		   if(dis2[y]>dis2[x]+edge[i].d)
		   {
		   	    dis2[y]=dis2[x]+edge[i].d;
		   	    a.dd=dis2[y];
		   	    a.p=y;
		   	    q.push(a);
		   }
		}
	}
}
signed main()
{
	cin>>n>>m;
	k=1;
	memset(head,-1,sizeof(head));
	for(int i=1;i<=m;i++)
	{
		int u,v,w;
		cin>>u>>v>>w;
		add(u,v,w);
	}
	dijkstra();
	cout<<dis2[n];
	return 0;
 } 
2024/5/25 09:39
加载中...