萌新求助,刚学最短路
查看原帖
萌新求助,刚学最短路
213173
小木虫楼主2022/6/21 22:59

rt,一种大常数新做法,tle了

#include <bits/stdc++.h>
using namespace std;
const int N=6e5+10;
struct e{int u,v,w;}E[N];
bool cmp(e a,e b){return a.w<b.w;}
int n,m;int cnt;int head[N];
struct EDGE{int v,w,next,id;}edge[N];
vector <int> col[N];int lst[N];
vector <int> dis[N];int MIN[N];
vector <int> vis[N];
vector <int> p[N];int pin[N];
void add(int u,int v,int w){
	edge[++cnt].next=head[u];
	if(edge[head[u]].w!=w)p[u].push_back(head[u]);
	edge[cnt].v=v;edge[cnt].w=w;
	col[v].push_back(w);dis[v].push_back(1e9);
	vis[v].push_back(0);head[u]=cnt;
	edge[cnt].id=col[v].size()-1;
}
struct node{
	int u,id,dis;
	bool operator <(const node &a)const{
		return dis>a.dis;
	}
};
priority_queue <node> Q;
void dijkstra(){
	dis[1].push_back(1);vis[1].push_back(0);col[1].push_back(-1);
	for(int i=1;i<=n;i++)MIN[i]=1e9;MIN[1]=1;
	node st=(node){1,dis[1].size()-1,1};Q.push(st);
	while(!Q.empty()){
		node now=Q.top();Q.pop();
		int u=now.u;int id=now.id;
		//cout<<dis[u][id]<<endl;
		if(vis[u][id])continue;
		vis[u][id]=1;lst[u]++;
		if(dis[u][id]>MIN[u])continue;
		MIN[u]=min(MIN[u],dis[u][id]);
		if(head[u]==0)continue;
		if(lst[u]==1){
			for(int i=head[u];i;i=edge[i].next){
				int v=edge[i].v;int w=edge[i].w;
				if(dis[v][edge[i].id]>dis[u][id]+(w!=col[u][id]&&col[u][id]!=-1)){
					dis[v][edge[i].id]=dis[u][id]+(w!=col[u][id]&&col[u][id]!=-1);
					Q.push((node){v,edge[i].id,dis[v][edge[i].id]});
				}
			}
		}
		int l=0;int r=p[u].size()-1;
		while(l<r){
			int mid=(l+r)/2;
			if(edge[p[u][mid]].w>=col[u][id])
				r=mid;
			else l=mid+1;
		}
		if(edge[p[u][l]].w!=col[u][id])continue;
		for(int i=p[u][l];edge[i].w==col[u][id];i=edge[i].next){
			int v=edge[i].v;
			if(dis[v][edge[i].id]>dis[u][id]){
				dis[v][edge[i].id]=dis[u][id];
				Q.push((node){v,edge[i].id,dis[v][edge[i].id]});
			}
		}
	}
}
int main(){
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>E[i].u>>E[i].v>>E[i].w;
	}sort(E+1,E+1+m,cmp);
	for(int i=1;i<=m;i++){
		add(E[i].u,E[i].v,E[i].w);
		add(E[i].v,E[i].u,E[i].w);
	}
	for(int i=1;i<=n;i++)p[i].push_back(head[i]);
	dijkstra();int ans=1e9;
	for(int i=0;i<dis[n].size();i++){
		ans=min(ans,dis[n][i]);
	}
	if(ans>m)cout<<-1;
	else cout<<ans;
	return 0;
}
2022/6/21 22:59
加载中...