10分求助
查看原帖
10分求助
1030776
Bluish_Light楼主2024/11/8 23:24

只对了#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;
}
2024/11/8 23:24
加载中...