60分求调

P2505 [HAOI2012] 道路

RandomLife @ 2023-12-08 16:49:29

开O2WA,关O2RE,求调:

#include<bits/stdc++.h>
using namespace std;
const int N=1.5e3+5,M=5e3+5,mod=1e9+7;
struct graph{
    int head[N],Next[M],ver[M],tot=0;
    long long val[M],cnt[N];
    void merge(int x,int y,long long z){
        ver[++tot]=y,val[tot]=z,Next[tot]=head[x],head[x]=tot,cnt[y]++;
    }
}g1;
int n,m,p[N],tot=0,cnt[N];
long long dist[N],cnt1[N],cnt2[N],ans[M];
bool inq[N],ing[N];
queue<int>q;
void spfa(int s){
    memset(dist,0x3f,sizeof dist);
    memset(inq,0,sizeof inq);
    q.push(s),dist[s]=0,inq[s]=1;
    while(!q.empty()){
        int x=q.front();
        inq[x]=0,q.pop();
        for(int i=g1.head[x];i;i=g1.Next[i]){
            int y=g1.ver[i];
            long long z=g1.val[i];
            if(dist[x]+z<dist[y]){
                dist[y]=dist[x]+z;
                if(!inq[y])q.push(y),inq[y]=1;
            }
        }
    }
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=m;++i){
        int x,y;
        long long z;
        cin>>x>>y>>z;
        g1.merge(x,y,z);
    }
    for(int i=1;i<=n;++i){
        tot=0;
        memset(ing,0,sizeof ing);
        memset(cnt,0,sizeof cnt);
        spfa(i);
        for(int j=1;j<=n;++j)
            for(int k=g1.head[j];k;k=g1.Next[k]){
                int d=g1.ver[k];
                long long v=g1.val[k];
                if(dist[j]+v==dist[d])ing[k]=1,cnt[d]++;
            }
        memset(inq,0,sizeof inq);
        memset(cnt1,0,sizeof cnt1);
        memset(cnt2,0,sizeof cnt2);
        cnt1[i]=1,q.push(i),inq[i]=1;
        while(!q.empty()){
            int x=q.front();
            q.pop(),p[++tot]=x;
            for(int j=g1.head[x];j;j=g1.Next[j]){
                if(!ing[j])continue;
                int y=g1.ver[j];
                if(!inq[y]){
                    cnt1[y]=(cnt1[y]+cnt1[x])%mod;  
                    if(!--cnt[y])q.push(y),inq[y]=1;
                }
            }
        }
//      cout<<"p:";
//      for(int i=1;i<=tot;++i)cout<<p[i]<<' ';
//      cout<<endl;
        for(int j=tot;j;--j){
            int x=p[j];
            cnt2[x]=1;
//          cout<<x<<endl;
            for(int k=g1.head[x];k;k=g1.Next[k]){
                if(!ing[k])continue;
                int y=g1.ver[k];
                cnt2[x]=(cnt2[x]+cnt2[y])%mod;
//              cout<<y<<' ';
            }
//          cout<<endl;
        }
        for(int j=1;j<=n;++j)
            for(int k=g1.head[j];k;k=g1.Next[k]){
                if(!ing[k])continue;
                int d=g1.ver[k];
                ans[k]=(ans[k]+cnt1[j]*cnt2[d]%mod)%mod;
//              cout<<k<<' '<<j<<' '<<d<<endl;
            }
//      cout<<"ans:";
//      for(int j=1;j<=m;++j)cout<<ans[j]<<' ';
//      cout<<endl;
//      cout<<"cnt1:";
//      for(int j=1;j<=n;++j)cout<<cnt1[j]<<' ';
//      cout<<endl;
//      cout<<"cnt2:";
//      for(int j=1;j<=n;++j)cout<<cnt2[j]<<' ';
//      cout<<endl;
    }
    for(int i=1;i<=m;++i)cout<<ans[i]<<endl;
    return 0;
}

by RandomLife @ 2023-12-08 19:59:30

破案了,ing 开小了


|