1491: [NOI2007]社交网络
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 804 Solved: 474
[ Submit][ Status]
Description
Input
Output
输出文件包括n 行,每行一个实数,精确到小数点后3 位。第i 行的实数表 示结点i 在社交网络中的重要程度。
Sample Input
4 4
1 2 1
2 3 1
3 4 1
4 1 1
1 2 1
2 3 1
3 4 1
4 1 1
Sample Output
1.000
1.000
1.000
1.000
1.000
1.000
1.000
HINT
为1
又加深了对floyd的理解
/**************************************************************
Problem: 1491
User: willinglive
Language: C++
Result: Accepted
Time:80 ms
Memory:1432 kb
****************************************************************/
//#define _TEST _TEST
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
/
#define for0(i,j) for(int i=0;i<j;i++)
#define for1(i,j) for(int i=1;i<=j;i++)
#define clear(arr,x) memset(arr,x,sizeof(arr))
/
int n,m;
double dis[101][101];
double a[101][101];
double ans[101];
/
/
void input()
{
int u,v;
double w;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dis[i][j]=1e15;
while(m--)
{
scanf("%d%d%lf",&u,&v,&w);
dis[u][v]=dis[v][u]=w;
a[u][v]=a[v][u]=1;
}
}
void solve()
{
///init///
calculate
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(dis[i][j]>dis[i][k]+dis[j][k])
dis[i][j]=dis[i][k]+dis[j][k],a[i][j]=0;
if(dis[i][j]==dis[i][k]+dis[j][k])
a[i][j]+=a[i][k]*a[k][j];
}
for(int i=1;i<=n;i++)a[i][i]=0;
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(dis[i][j]==dis[i][k]+dis[j][k]&&a[i][j]>0)
ans[k]+=a[i][k]*a[k][j]/a[i][j];
}
/output/
for(int i=1;i<=n;i++) printf("%.3lf\n",ans[i]);
}
/
int main()
{
input();
solve();
return 0;
}