社区讨论

60pts 求助 玄关

P1608路径统计参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lxzgvs3l
此快照首次捕获于
2024/06/29 09:52
2 年前
此快照最后确认于
2024/06/29 13:23
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000000+10;
int n,m;
int dis[maxn],cnt[maxn];
bool vis[maxn];
struct node{
	int to,w;
	node(int t,int ww){
		to=t; w=ww;
	}
};
vector<node> vec[maxn*2];
struct qnode{
	int id,d;
	qnode(int i,int j){
		id=i; d=j;
	}
	bool friend operator <(qnode a,qnode b){
		return a.d>b.d;
	}
};
priority_queue<qnode> q;
void dij(int s){
	memset(dis,0x7f,sizeof(dis));
	memset(cnt,0,sizeof(cnt));
	memset(vis,false,sizeof(vis));
	q.push(qnode(s,0)); 
	cnt[s]=1; 
	dis[s]=0;
	while(!q.empty()){
		int u=q.top().id; q.pop();
		if(vis[u]==true) continue;
		vis[u]=true;
		for(int i=0;i<vec[u].size();i++){
			int v=vec[u][i].to;
			if(dis[v]>dis[u]+vec[u][i].w){
				dis[v]=dis[u]+vec[u][i].w;
				cnt[v]=cnt[u];
				if(!vis[v]) q.push(qnode(v,dis[v]));
			}else if(dis[v]==dis[u]+vec[u][i].w) cnt[v]=(cnt[v]+cnt[u]);
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		vec[u].push_back(node(v,w));
		//vec[v].push_back(node(u,w));
	}
	dij(1);
	if(dis[n]>=0x7f) cout<<"No answer";
	else cout<<dis[n]<<" "<<cnt[n];
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...