64pts求助
查看原帖
64pts求助
218223
chenxsir楼主2020/10/4 18:42

wa了5,6,7,9

#include<iostream>
#include<iostream>
#include<queue>
#include<vector>
#include<cstring>
#include<fstream>
using namespace std;
const int N=2010,inf=0x3f3f3f3f;
int n,m,s,t,ans=inf,book[N],dis[N],vis[N][N],cnt[N];
struct pp
{
    int u,d;
};
pp m_p(int u,int d) {pp a; a.u=u; a.d=d; return a;}
bool operator <(const pp &a, const pp &b)
{
    return a.d>b.d;
}
vector<pp>dg[N];
void dij(int nod);
int main()
{
    //freopen("P1608_5.in","r",stdin);
    //freopen("P2296.out","w",stdout);
    memset(vis,0x3f,sizeof vis);
    cin>>n>>m;
    for(int i=1; i<=m; i++)
    {
        int a,b,d; cin>>a>>b>>d;
        //if(vis[a][b]<=d) continue; 
        vis[a][b]=min(vis[a][b],d);
        //dg[b].push_back(m_p(a,d));
        //dg[a].push_back(m_p(b,d));
    }
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
        {
            if(vis[i][j]!=inf) dg[i].push_back(m_p(j,vis[i][j]));
        }
    s=n;
    dij(1);
    if(dis[s]==inf) cout<<"No answer"<<endl;
    else  cout<<dis[s]<<" "<<cnt[s];
    //cout<<dis[t]<<endl; 
    //for(int i=1; i<=n; i++) cout<<dis[i]<<endl;
    cin>>n;
}
void dij(int nod)
{
    memset(dis,0x3f,sizeof dis); dis[nod]=0;
    memset(book,0,sizeof book);
    memset(cnt,0,sizeof cnt);
    priority_queue<pp>q; 
    q.push(m_p(nod,0)); cnt[nod]=1; book[nod]=1;
    while(q.size())
    {
        //cout<<"asf"<<endl;
        pp now=q.top(); q.pop(); 
        int u=now.u, d=now.d; //book[u]=0;
        if(u==s) continue;
        //vector<int>g[N];
        for(int i=0; i<dg[u].size(); i++)
        {
            int v=dg[u][i].u,l=dg[u][i].d; //cout<<v<<endl;
            if(dis[v]>=l+d)
            {
                //g[v].push_back(l);
                dis[v]=l+d; cnt[v]+=cnt[u]; 
                if(book[v]) continue;
                book[v]=1;
                q.push(m_p(v,dis[v]));
            }
        }
//        if(u!=s) cnt[u]=0;
    }
    return ;
}
2020/10/4 18:42
加载中...