求助dij(37分+悬关)
  • 板块P1608 路径统计
  • 楼主Zikl
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/12 16:52
  • 上次更新2023/11/12 17:04:52
查看原帖
求助dij(37分+悬关)
300166
Zikl楼主2023/11/12 16:52

怎么回事呢,dij 都调不出来

代码:

#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;
bool a[N][N];
int head[N*4],ver[N*4],Next[N*4],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();
        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();
    F(i,1,e){
        int I=read(),j=read(),c=read();
        if(a[I][j]==0)
        add(I,j,c);add(j,I,c);
        a[I][j]=a[j][I]=1;
    }
    dijkstra();
    if(!ans[n]) printf("No answer");
    else printf("%d %d",dis[n],ans[n]);
    return 0;
}

#4

输入:

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

我的输出

4 8
2023/11/12 16:52
加载中...