dij54分,5、6、7、10、11点不过,求助大佬
查看原帖
dij54分,5、6、7、10、11点不过,求助大佬
232507
OK咯莫名其妙楼主2021/8/19 09:07
#include<bits/stdc++.h>
using namespace std;
const int maxn=20010;
const int maxxn=25000010;
int head[maxn],vis[maxn],dis[maxn],cnt[maxn],tot,n,m;
struct e{
	int u,v,w,nxt;
}edge[maxxn];
void add(int u,int v,int w){
	edge[++tot].u=u;
	edge[tot].v=v;
	edge[tot].w=w;
	edge[tot].nxt=head[u];
	head[u]=tot;
}
struct node{
	int w,now;
	inline bool operator<(const node&x) const
	{
		return w>x.w;
	}
};
priority_queue<node> q;
void dij(int s){
	memset(dis,707406378,sizeof(dis));
	dis[s]=0;
	cnt[s]=1;
	q.push(node{0,s});
	while(!q.empty()){
		node x=q.top();
		q.pop();
		long long u=x.now;
		if(vis[u])continue;
		vis[u]=1;
		for(int i=head[u];i;i=edge[i].nxt){
			int v=edge[i].v;
			if(dis[v]>dis[u]+edge[i].w){
				dis[v]=dis[u]+edge[i].w;
				cnt[v]=cnt[u];
				q.push(node{dis[v],v});
			}
			else if(dis[v]==dis[u]+edge[i].w){
				cnt[v]+=cnt[u];
			}
		}
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int x,y,w;
		cin>>x>>y>>w;
		add(x,y,w);
	}
	dij(1);
	if(dis[n]==707406378){
		cout<<"No answer"<<endl;
		return 0;
	}
	else
	cout<<dis[n]<<" "<<cnt[n]<<endl;
	return 0;
}
2021/8/19 09:07
加载中...