タイトル
質問の意味を簡素化:
重要度を設定し、次のように定義される:う\(C_ {S、T}は \) を表し\(S \)をする(T \)\最も短い、異なる番号を\(C_ {S、T}(V) \)の経過を表し\(V \)から\(S \)に(T \)\最も短絡の数、定義:
\ [I(V)= \ sum_ {S \ NEがV、T \ NE V} \ FRAC {C_ {S、T }(V)} {C_ {S、T}} \]ノードのための\(V \)ソーシャルネットワークの重要性。
無向グラフ、所与\(N- \)点、\(Mの\)エッジ、ソーシャルネットワークのそれぞれの決定された重要性を指します。
分析
そして、重要な都市ほとんど。
\(nは\ 100 leqslant \) 、明らかに\(floyed \) 、解決するために、その間に乗算原理の数に基づいて、この点を通る最短経路に関する統計。
最後に、統計がすることができます。
コード
#include<bits/stdc++.h>
typedef long long ll;
const int maxn=101;
namespace IO
{
char buf[1<<15],*fs,*ft;
inline char getc() { return (ft==fs&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),ft==fs))?0:*fs++; }
template<typename T>inline void read(T &x)
{
x=0;
T f=1, ch=getchar();
while (!isdigit(ch) && ch^'-') ch=getchar();
if (ch=='-') f=-1, ch=getchar();
while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48), ch=getchar();
x*=f;
}
}
using IO::read;
template<typename T>inline bool chkMin(T &a,const T &b) { return a>b ? (a=b, true) : false; }
template<typename T>inline bool chkMax(T &a,const T &b) { return a<b ? (a=b, true) : false; }
ll d[maxn][maxn],s[maxn][maxn];
double ans[maxn];
int main()
{
int n,m;read(n);read(m);
memset(d,0x7f,sizeof(d));ll inf=d[1][1];
for (ll i=1,x,y,z; i<=m; ++i) read(x),read(y),read(z),d[x][y]=d[y][x]=z,s[x][y]=s[y][x]=1;
for (int k=1; k<=n; ++k)
for (int i=1; i<=n; ++i)
for (int j=1; j<=n; ++j)
{
if (d[i][k]==inf && d[k][j]==inf) continue;
if (chkMin(d[i][j],d[i][k]+d[k][j])) s[i][j]=s[i][k]*s[k][j];
else if (d[i][j]==d[i][k]+d[k][j]) s[i][j]+=s[i][k]*s[k][j];
}
for (int k=1; k<=n; ++k)
for (int i=1; i<=n; ++i)
for (int j=1; j<=n; ++j)
{
if (i==j || i==k || k==j) continue;
if (d[i][j]==d[i][k]+d[k][j]) ans[k]+=(1.0*s[i][k]*s[k][j])/s[i][j];
}
for (int i=1; i<=n; ++i) printf("%.3lf\n",ans[i]);
return 0;
}