BZOJ 1491 社交網路 最短路 dp

2021-09-27 02:34:11 字數 1215 閱讀 8249

給出n

≤100

n\leq100

n≤100,m

≤4500

m\leq4500

m≤4500

的無向圖,權值c

≤1000

c\leq1000

c≤1000

,然後求問對於每個點v

vv,求i(v

)=∑s

≠v,s

≠tcs

,t(v

)cs,

ti(v)=\sum_\frac(v)}}

i(v)=∑

s̸​=

v,s̸

​=t​

cs,t

​cs,

t​(v

)​,c s,

tc_

cs,t

​定義為s,t

s,ts,

t路徑上的最短路數,cs,

t(v)

c_(v)

cs,t​(

v)定義為經過v

vv的s,t

s,ts,

t路徑上最短路方案數。

由於n

nn很小,直接flo

yd

floyd

floy

d求出兩點之間的最短距離,同時統計出所有點對的方案數。然後列舉每個點,再列舉所有的不為這個點的互異點對,計算這個點的貢獻。

#includeusing namespace std;

typedef long long ll;

const int inf=0x3f3f3f3f;

const ll inf=long_long_max;

const int n=105;

int mp[n][n];

ll f[n][n];

double ans[n];

int main()

} for(int i=1;i<=m;i++)

for(int k=1;k<=n;k++)

else if(mp[i][k]+mp[k][j]==mp[i][j])

}} }

for(int i=1;i<=n;i++)

}} }

for(int i=1;i<=n;i++)

printf("%.3lf\n",ans[i]);

return 0;

}

BZOJ 1491 NOI2007 社交網路

顯然這是一道要求多源最短路的題目,資料範圍很小,目測用弗洛伊德演算法。由題意,先求出各個點之間的最短路徑,同時利用乘法原理,計算出由 i 到 j 之間的最短路徑個數。如果又發現了一條最短路,由乘法原理計算增加的路徑個數再加上即可。我寫的 沒有去除自己到自己的路徑,因此需清空,但也可在 floyd 中...

BZOJ 1491 NOI2007 社交網路

傳送門 資料範圍很小,我們考慮floyd。要求的是路徑條數,所以我們在floyd的時候直接預處理出兩點之間的路徑條數。用num i j 表示,然後floyd的時候,如果dis i j include include include using namespace std const int maxn...

BZOJ 1491 NOI2007 社交網路

鏈結 我是鏈結,點我呀 題意 在這裡輸入題意 題解 floyd演算法 算出任意兩點之間的最短路,以及最短路的條數。然後三重迴圈列舉v,s,t就好 看看s到t的最短路徑不經過v 經過的話增加答案貢獻 o n 3 include include define ll long long using nam...