RT,用的Dijkstra代替Floyd,long long 都开了
求差错
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
#include<vector>
using namespace std;
const long long Maxn=110;
const long long Maxm=9010;
const long long inf=(1ll<<60);
struct node{
long long pos,dis;
bool operator <(const node &x)const
{
return x.dis<dis;
}
};
long long f[Maxn][Maxn]; // 最短路长度
long long c[Maxn][Maxn]; // 最短路数量
long long nxt[Maxm],to[Maxm];
long long dis[Maxn],len[Maxm];
long long head[Maxn],cnt[Maxn];
long long n,m,edgecnt;
bool vis[Maxn];
inline long long read()
{
long long s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0' && ch<='9')s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return s*w;
}
inline void add(long long x,long long y,long long c)
{
++edgecnt;
nxt[edgecnt]=head[x];
to[edgecnt]=y;
len[edgecnt]=c;
head[x]=edgecnt;
}
void dij(long long s)
{
priority_queue <node> q;
fill(dis+1,dis+1+n,inf); // 最短路长度
memset(vis,0,sizeof(vis));
fill(cnt+1,cnt+1+n,0ll); // 最短路数量
dis[s]=0ll,cnt[s]=1ll;
vis[s]=1ll,q.push(node{s,0ll});
while(q.size())
{
long long x=q.top().pos;
q.pop();
for(long long i=head[x];i;i=nxt[i])
{
long long y=to[i];
if(dis[y]>dis[x]+len[i])
{
dis[y]=dis[x]+len[i];
cnt[y]=cnt[x];
if(!vis[y])vis[y]=1,q.push(node{y,dis[y]});
}
else if(dis[y]==dis[x]+len[i])
cnt[y]+=cnt[x];
}
}
for(long long i=1;i<=n;++i)
f[s][i]=dis[i],c[s][i]=cnt[i];
}
int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
n=read(),m=read();
for(long long i=1;i<=m;++i)
{
long long x=read(),y=read(),c=read();
add(x,y,c),add(y,x,c);
}
for(long long i=1;i<=n;++i)
dij(i);
for(long long k=1;k<=n;++k)
{
double tmp=0.0;
for(long long i=1;i<=n;++i)
{
if(i==k)continue;
for(long long j=1;j<=n;++j)
{
if(j==k)continue;
if(f[i][k]+f[k][j]!=f[i][j])continue;
double val=(c[i][k]*c[k][j])*1.0;
tmp+=1.0*val/c[i][j];
}
}
printf("%.3lf\n",tmp);
}
return 0;
}