求助,本题SPFA算法78分
查看原帖
求助,本题SPFA算法78分
495512
Grimgod楼主2022/7/11 18:18
 #include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
	int w=0,x=0;char ch;
	while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
	while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return w?-x:x;
}
int n,m;
int g,h,ph;
int mapl[2005][2005];
bool vis[20005];
int cnt[2005];
int dis[20005];
int s=1;
inline void add(int u,int v,int len){
	if(len!=mapl[u][v]) mapl[u][v]=len;
}
inline void spfa(){
	queue <int > q;
	memset(dis,0x3f,sizeof(dis));
	vis[s]=1;
	cnt[s]=1;
	dis[s]=0;
	q.push(s);
	while(!q.empty()){
		register int now=q.front();
		q.pop();
		for(register int i=1;i<=n;++i){
			if(mapl[now][i]==0) continue;
			register int to=i,l=mapl[now][i];
			if(dis[to]>dis[now]+l){
				dis[to]=dis[now]+l;
				cnt[to]=cnt[now];
				if(!vis[to]){
					vis[to]=1;
					q.push(to);
				}
			}
			else if(dis[to]==dis[now]+l){
				cnt[to]+=cnt[now];
			}
			else cnt[to]+=0;
		}
		vis[now]=0;
	}
}
signed main(){
	n=read(),m=read();
	for(register int i=1;i<=m;++i){
		g=read(),h=read(),ph=read();
		if(g!=h) add(g,h,ph);
	}
	spfa();
	if(dis[n]==0x3f3f3f3f) puts("No answer");
	else cout<<dis[n]<<" "<<cnt[n];
	return 0;
}
2022/7/11 18:18
加载中...