rt,帖详情

#include<bits/stdc++.h>
#define max_size 1145144
using namespace std;
struct Edge {
int to,nxt,dis,self;
} edge[max_size];
struct node {
int dis,pos;
bool operator<(const node &other) const {
return other.dis<dis;
}
};
int head[max_size];
int cnt;
int n,m,s,u,v,w;
int Dis[max_size],vis[max_size];
int check[max_size],ans[max_size];
int pos,dis,child;
node tmp;
void add(int u,int v,int w) {
cnt++;
edge[cnt].nxt=head[u];
edge[cnt].dis=w;
edge[cnt].to=v;
head[u]=cnt;
}
std::priority_queue<node> q;
void Dijkstra2() {
q.push({0,1});
while(!q.empty()) {
tmp=q.top(),q.pop();
pos=tmp.pos,dis=tmp.dis;
if (vis[pos]) continue;
vis[pos]=1;
//cout<<pos<<endl;
for(int i=head[pos];i!=0;i=edge[i].nxt) {
child=edge[i].to;
if (Dis[child]==Dis[pos]+edge[i].dis) {
ans[child]=(ans[child]+ans[pos]);
}
if (Dis[child]>Dis[pos]+edge[i].dis) {
Dis[child]=Dis[pos]+edge[i].dis;
ans[child]=ans[pos];
if (vis[child]==0)
q.push((node){Dis[child],child});
}
//cout<<Dis[child]<<" "<<child<<endl;
}
}
}
signed main()
{
scanf("%d%d",&n,&m);
memset(Dis,0x3f,sizeof(Dis));
for(int i=1;i<=m;i++) {
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
//add(v,u,w);
}
Dis[1]=0;
ans[1]=1;
Dijkstra2();
if (Dis[n]==0x3f3f3f3f) {
cout<<"No answer"<<endl;
} else {
cout<<Dis[n]<<" "<<ans[n]<<endl;
}
return 0;
}