记录编号 152971 评测结果 AAAAAAAAAA
题目名称 [HAOI 2012]道路 最终得分 100
用户昵称 Gravatar水中音 是否通过 通过
代码语言 C++ 运行时间 1.187 s
提交时间 2015-03-16 11:13:05 内存使用 0.45 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MOD 1000000007
#define N 1510
#define M 5010
#define INF 1e9
int n,m,i,p,j,zj1,zj2,zj3;
int ans[M]={0};

int to[M]={0},fr[M]={0},head[N]={0},ne[M]={0},w[M]={0},sj=0;
inline void addedge(int u,int v,int z)
{to[++sj]=v,fr[sj]=u,ne[sj]=head[u],head[u]=sj,w[sj]=z;}

void init()
{
	scanf("%d%d",&n,&m);
	for(i=1;i<=m;i++)
	{
		scanf("%d%d%d",&zj1,&zj2,&zj3);
		addedge(zj1,zj2,zj3);
	}
}

int que[N]={0},qhead=1,qtail=0;bool flag[N]={0};
inline int GET()
{int x=que[qhead];que[0]--,flag[x]=0;if(++qhead==N)qhead=1;return x;}
inline void PUSH(int x)
{que[0]++,flag[x]=1;if(++qtail==N)qtail=1;que[qtail]=x;}

int dis[N]={0};
inline void spfa(int x)
{
	for(i=1;i<=n;i++)dis[i]=INF;dis[x]=0,PUSH(x);
	while(que[0])
	for(zj1=GET(),i=head[zj1];i;i=ne[i])
	if((zj2=dis[zj1]+w[i])<dis[to[i]])
	{dis[to[i]]=zj2;if(!flag[to[i]])PUSH(to[i]);}
}

int s[N]={0};bool flags[N]={0};
inline void GET_s(int x)
{
	flags[x]=1;
	for(int h=head[x];h;h=ne[h])
	if(dis[to[h]]==dis[x]+w[h])
	{s[to[h]]++;if(!flags[to[h]])GET_s(to[h]);}
}

int frs[N]={0};bool str[M]={0};
inline void GET_frs(int x)
{
	for(int h=head[x];h;h=ne[h])
	if(dis[to[h]]==dis[x]+w[h])
	{
		str[h]=1;frs[to[h]]+=frs[x];
		while(frs[to[h]]>=MOD)frs[to[h]]-=MOD;
		if(!(--s[to[h]]))GET_frs(to[h]);
	}
} 

int tos[N]={0};
inline void GET_tos(int x)
{
	tos[x]=1;
	for(int h=head[x];h;h=ne[h])
	if(dis[to[h]]==dis[x]+w[h])
	{
		if(!tos[to[h]])GET_tos(to[h]);
		tos[x]+=tos[to[h]];
		while(tos[x]>=MOD)tos[x]-=MOD;
	}
}

void work()
{
	for(j=1;j<=n;j++)
	{
		spfa(j);GET_s(j);frs[j]=1,GET_frs(j);GET_tos(j);
		for(i=1;i<=sj;i++)if(str[i])
		ans[i]+=frs[fr[i]]*tos[to[i]],ans[i]%=MOD;
		memset(flags,0,sizeof(flags));memset(str,0,sizeof(str));
		memset(frs,0,sizeof(frs));memset(tos,0,sizeof(tos));
	}
	for(i=1;i<=m;i++)
	printf("%d\n",ans[i]);
}
int main()
{
	freopen("roadsw.in","r",stdin);
	freopen("roadsw.out","w",stdout);
	init();
	work();
	return 0;
}