Dijkstra WA On #8 求助
查看原帖
Dijkstra WA On #8 求助
120362
Priori_Incantatem楼主2020/11/27 16:43

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;
}
2020/11/27 16:43
加载中...