这道题的输入怎么怪怪的,只有37分
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<cstring>
#define int long long
#define F(i,a,b) for(int i=(a);i<=(b);i++)
#define pa pair<int,int>
using namespace std;
const int N=2e3+5;
int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
priority_queue< pa,vector<pa>,greater<pa> >q;
int n,e,a[N][N];
int head[N*4],ver[N*4],Next[N*4],vis[N],edg[N*4],tot;
int ans[N],dis[N];
void add(int x,int y,int z){
ver[++tot]=y,edg[tot]=z;Next[tot]=head[x],head[x]=tot;
}
void dijkstra(){
F(i,1,n) dis[i]=1e9;
dis[1]=0;
ans[1]=1;
q.push(make_pair(1,0));
while(q.size()){
int u=q.top().first;
q.pop();
if(vis[u]) continue;
vis[u]=1;
for(int i=head[u];i;i=Next[i]){
int y=ver[i],yy=edg[i];
if(dis[y]>dis[u]+yy){
dis[y]=dis[u]+yy;
ans[y]=ans[u];
q.push(make_pair(y,dis[y]));
}
else if(dis[y]==dis[u]+yy){
ans[y]=ans[u]+ans[y];
}
}
}
}
signed main(){
n=read(),e=read();
memset(a,63,sizeof(a));
F(i,1,e){
int I=read(),j=read(),c=read();
if(a[I][j]==c) continue;
add(I,j,c);
a[I][j]=c;
}
dijkstra();
if(dis[n]==1e9) printf("No answer");
else printf("%d %d",dis[n],ans[n]);
return 0;
}
我没过的测试点:
输入
6 12
1 2 1
2 3 1
3 2 1
3 4 1
4 3 1
4 5 1
2 5 1
5 2 1
5 4 1
4 6 1
5 6 2
3 6 2
4 4