WA 52pts C++邻接表求调 玄关
查看原帖
WA 52pts C++邻接表求调 玄关
798144
SukiYuri楼主2024/3/13 22:37
#include<cstdio>
#include<iostream>
#include<vector>
#include<cmath>
#include<queue>
using namespace std;
struct edge{
    int to,w;
};
vector<edge> a[2005];
int d[2005],ans[2005];
bool exi[2005][2005][11];
bool vis[2005];
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    fill(d+1,d+n+1,1e9+114);
    priority_queue <pair<int,int>,vector<pair<int,int> > ,greater<pair<int,int> > > q;
    for(int i=1;i<=m;++i){
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        if(exi[u][v][w]||exi[v][u][w])continue;
        exi[u][v][w]=exi[v][u][w]=true;
        a[u].push_back({v,w});
        a[v].push_back({u,w});
    }
    q.push(make_pair(0,1));
    ans[1]=1;
    d[1]=0;
    while(!q.empty()){
        int tp=q.top().second;
        q.pop();
        for(edge i:a[tp]){
            if(d[i.to]>d[tp]+i.w){
                d[i.to]=d[tp]+i.w;
                q.push(make_pair(d[i.to],i.to));
                ans[i.to]=0;
            }
            if(d[i.to]==d[tp]+i.w)ans[i.to]+=ans[tp];
        }
    }
    //for(int i=1;i<=n;++i)cout<<ans[i]<<" ";
    if(d[n]==1e9+114&&ans[n]==0)puts("No answer");
    else printf("%d %d\n",d[n],ans[n]);
    return 0;
}
2024/3/13 22:37
加载中...