bzoj 1491 floyd

  我们用w[i][j]表示i到j的最短路的数量,dis[i][j]表示i到j的最短路,那么我们在floyd的时候,如果dis[i][k]+dis[k][j]==dis[i][j],根据乘法原理我们就w[i][j]+=w[i][k]*w[k][j],小于的时候我们就重新对w[i][j]赋值。

  因为floyd最外层循环的为中间节点k,所以k的循环相当于将图拓展了一部分,那么这样最短路的数量不会算重复。

  备注:floyd没学好,觉得这么写是不对的,想不出别的方法之后写了写发现对了,然后查了一下floyd。


/**************************************************************
Problem: 1491
User: BLADEVIL
Language: C++
Result: Accepted
Time:68 ms
Memory:948 kb
****************************************************************/

//By BLADEVIL
#include <cstdio>
#include <cstring>
#define maxn 110
#define maxm 10010

using namespace std;

int n,m;
int dis[maxn][maxn];
double w[maxn][maxn],ans[maxn];

int main() {
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) dis[i][j]=10000000;
for (int i=1;i<=m;i++) {
int x,y,z; scanf("%d%d%d",&x,&y,&z);
dis[x][y]=dis[y][x]=z;
w[x][y]=w[y][x]=1;
}
for (int k=1;k<=n;k++) {
for (int i=1;i<=n;i++) if (i!=k)
for (int j=1;j<=n;j++) if (j!=i&&j!=k) {
if (dis[i][k]+dis[k][j]<dis[i][j]) {
dis[i][j]=dis[i][k]+dis[k][j];
w[i][j]=w[i][k]*w[k][j];
} else
if (dis[i][k]+dis[k][j]==dis[i][j]) w[i][j]+=w[i][k]*w[k][j];
}
}
for (int k=1;k<=n;k++) {
for (int i=1;i<=n;i++) if (i!=k)
for (int j=1;j<=n;j++) if (j!=i&&j!=k)
if (dis[i][k]+dis[k][j]==dis[i][j]) ans[k]+=(w[i][k]*w[k][j])/w[i][j];
printf("%.3f\n",ans[k]);
}
return 0;
}

bzoj 1491 floyd

时间: 2024-10-09 09:09:16

bzoj 1491 floyd的相关文章

BZOJ 1491: [NOI2007]社交网络( floyd )

floyd...求最短路时顺便求出路径数. 时间复杂度O(N^3) ------------------------------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<cstring> using namespace std; typedef long long ll; const int max

[BZOJ 1491] [NOI 2007] 社交网络

好吧先不吐槽这道题的题目是一部介绍facebook的电影…… 1491: [NOI2007]社交网络 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1010  Solved: 584[Submit][Status][Discuss] Description Input Output 输出文件包括n 行,每行一个实数,精确到小数点后3 位.第i 行的实数表 示结点i 在社交网络中的重要程度. Sample Input 4 4 1 2 1 2 3 1

bzoj 1491: [NOI2007]社交网络

Description 在社交网络(socialnetwork)的研究中,我们常常使用图论概念去解释一些社会现象.不妨看这样的一个问题. 在一个社交圈子里有n个人,人与人之间有不同程度的关系.我们将这个关系网络对应到一个n个结点的无向图上, 两个不同的人若互相认识,则在他们对应的结点之间连接一条无向边,并附上一个正数权值c,c越小,表示两个人 之间的关系越密切.我们可以用对应结点之间的最短路长度来衡量两个人s和t之间的关系密切程度,注意到最短路 径上的其他结点为s和t的联系提供了某种便利,即这些

【BZOJ 1491】 [NOI2007]社交网络

Description Input Output 输出文件包括n 行,每行一个实数,精确到小数点后3 位.第i 行的实数表 示结点i 在社交网络中的重要程度. Sample Input 4 4 1 2 1 2 3 1 3 4 1 4 1 1 Sample Output 1.000 1.000 1.000 1.000 HINT 为1 看到数据范围,显然Floyd map[i][j]表示i-->j的最短路,a[i][j]表示表示从i到j最短路的方案数,在改变最短路时该数组清零 1 #include<

bzoj 1027 floyd求有向图最小环

结合得好巧妙.... 化简后的问题是: 给你两个点集A,B,求B的一个子集BB,使得BB的凸包包含A的凸包,求BB的最小大小. 先特判答案为1,2的情况,答案为3的情况,我们先构造一个有向图: 对于B集合中的两个点u,v,如果 所有A集合的点都在u->v的左侧,那么就连一条u->v的边. 于是我们可以证明一个包含A的凸包和我们连出来的有向图中的环一一对应(不考虑点数小于等于2的情况). 于是现在我们的问题就是求最小的一个环,用floyd搞,最后统计min(f[i][i]). 1 /******

[BZOJ 1027][JSOI2007]合金(计算几何+Floyd最小环)

Description 某公司加工一种由铁.铝.锡组成的合金.他们的工作很简单.首先进口一些铁铝锡合金原材料,不同种类的原材料中铁铝锡的比重不同.然后,将每种原材料取出一定量,经过融解.混合,得到新的合金.新的合金的铁铝锡比重为用户所需要的比重. 现在,用户给出了n种他们需要的合金,以及每种合金中铁铝锡的比重.公司希望能够订购最少种类的原材料,并且使用这些原材料可以加工出用户需要的所有种类的合金. Solution 今天考试T3的70分算法似乎是这道原题(然而我没做过QwQ) 思路值得学习一下(

BZOJ 2324: [ZJOI2011]营救皮卡丘( floyd + 费用流 )

昨晚写的题...补发一下题解... 把1~N每个点拆成xi, yi 2个. 预处理i->j经过编号不超过max(i,j)的最短路(floyd) S->0(K, 0), S->xi(1, 0)(从i点继续走), 0->yi(1, distance(0->i))(从0出发), xi->yi(1, distance(i->j))(i点走向j点), yi->T(1, 0)(每个点必须经过至少一次), 然后跑最小费用最大流, 费用即为答案. 写完这道题感觉...只是会

【BZOJ 1027】 (凸包+floyd求最小环)

[题意] 某公司加工一种由铁.铝.锡组成的合金.他们的工作很简单.首先进口一些铁铝锡合金原材料,不同种类的原材料中铁铝锡的比重不同.然后,将每种原材料取出一定量,经过融解.混合,得到新的合金.新的合金的铁铝锡比重为用户所需要的比重. 现在,用户给出了n种他们需要的合金,以及每种合金中铁铝锡的比重.公司希望能够订购最少种类的原材料,并且使用这些原材料可以加工出用户需要的所有种类的合金. [分析] 只要考虑前两个物质的比例,因为加起来等于1. 如果你看过zoj3154,就会知道这题的模型,用二元组表

BZOJ 1738: [Usaco2005 mar]Ombrophobic Bovines 发抖的牛( floyd + 二分答案 + 最大流 )

一道水题WA了这么多次真是.... 统考终于完 ( 挂 ) 了...可以好好写题了... 先floyd跑出各个点的最短路 , 然后二分答案 m , 再建图. 每个 farm 拆成一个 cow 点和一个 shelter 点, 然后对于每个 farm x : S -> cow( x ) = cow( x ) 数量 , shelter( x ) -> T = shelter( x ) 容量 ; 对于每个dist( u , v ) <= m 的 cow( u ) -> shelter( v