求助dij(悬关)
  • 板块P1608 路径统计
  • 楼主Zikl
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/11/12 17:18
  • 上次更新2023/11/12 19:35:08
查看原帖
求助dij(悬关)
300166
Zikl楼主2023/11/12 17:18

这道题的输入怎么怪怪的,只有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
2023/11/12 17:18
加载中...