10分求助

P2505 [HAOI2012] 道路

Bluish_Light @ 2024-11-08 23:24:34

只对了#1,但另外一道和这一道的样例都过了

Code:

#include<bits/stdc++.h>
using namespace std;
const long long mod=1e9+7;
long long n,m,u,v,w,ans[3005],cnt1[3005],cnt2[3005],answer[3005],tuopuxu[3005],cs;
bool vis[3005],cant[3005];
struct node{
    long long to,w,come;
    friend bool operator <(node a,node b){
        return a.w>b.w;
    }
};
vector<node>p[10005];
void dij(int id){
    priority_queue<node>q;
    for(int i=1;i<=n;i++){
        vis[i]=0,cant[i]=0,cnt1[i]=0,cnt2[i]=0,ans[i]=1e18,tuopuxu[i]=0;
    }
    ans[id]=0,cnt1[id]=1;
    q.push({id,0,0});
    while(!q.empty()){
        int x=q.top().to;
        q.pop();
        tuopuxu[++cs]=x;
        if(vis[x]) continue;
        vis[x]=true;
        for(int i=0;i<p[x].size();i++){
            int now=p[x][i].to;
            if(ans[now]>ans[x]+p[x][i].w){
                ans[now]=ans[x]+p[x][i].w;
                cnt1[now]=cnt1[x];
                if(!vis[now]) q.push({now,ans[now],0});
            }
            else if(ans[now]==ans[x]+p[x][i].w){
                (cnt1[now]+=cnt1[x])%mod;
            }
        }
    }
}
void tuopusort(int id){
    for(int j=cs;j>=1;j--){
        int x=tuopuxu[j];
        cnt2[x]=1;
        for(int i=0;i<p[x].size();i++){
            int now=p[x][i].to,come=p[x][i].come;
            if(ans[now]==ans[x]+p[x][i].w){
                (cnt2[x]+=cnt2[now])%mod;
                (answer[come]+=(cnt1[x]*cnt2[now])%mod)%mod;
            }
        }
    }
    cs=0;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        cin>>u>>v>>w;
        p[u].push_back({v,w,i});
    }
    for(int i=1;i<=n;i++){
        dij(i);
        tuopusort(i);
    }
    for(int i=1;i<=m;i++) cout<<answer[i]<<'\n';
    return 0;
}

|