只对了#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;
}