UVa 821 - Page Hopping(Floyd)

给出能相互到达的网页,输出在给出的网页中相互到达需要点击几次,首先离散化,然后用Floyd求少点击次数,枚举求平均点击次数。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
const int maxn=110;
const int inf=0x3f3f3f3f;
int d[maxn][maxn];
map<int,int> id;
int main(){
    int n,u,v,t=0;
    while(~scanf("%d%d",&u,&v)&&(u||v)){
        memset(d,0x3f,sizeof d);
        id.clear();
        n=0;
        if(!id.count(u)) id[u]=++n;
        if(!id.count(v)) id[v]=++n;
        d[id[u]][id[v]]=1;
        while(~scanf("%d%d",&u,&v)&&(u||v)){
            if(!id.count(u)) id[u]=++n;
            if(!id.count(v)) id[v]=++n;
            d[id[u]][id[v]]=1;
        }
        for(int k=1;k<=n;++k)
            for(int i=1;i<=n;++i)
                for(int j=1;j<=n;++j)
                    d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
        int sum=0;
        for(int i=1;i<=n;++i)
            for(int j=1;j<=n;++j)
                if(i!=j&&d[i][j]!=inf) sum+=d[i][j];
        printf("Case %d: average length between pages = %.3lf clicks\n",++t,double(sum)/(n*(n-1)));
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-30 13:45:52

UVa 821 - Page Hopping(Floyd)的相关文章

821 - Page Hopping (Floyd)

很裸的Floyd水题,只需要注意一点: 题目中给的结点编号并不是完整的从1~n,不过没有关系,因为我们初始化为INF,当两点间距离不等于INF时相加就可以了. 细节参见代码: #include<bits/stdc++.h> using namespace std; const int maxn = 105; const int INF = 1000000; int a,b,n,d[maxn][maxn],kase = 0; void Floyd() { for(int k=1;k<=n;

【UVA】821-Page Hopping(Floyd)

模板题,求一个点到任何一点的距离,用Floyd就行了,结点不一定是从1 ~ n 的,所以需要记录结点的id 14063895 821 Page Hopping Accepted C++ 0.119 2014-08-19 10:00:27 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> #include<sta

UVa 821 Page Hopping【Floyd】

题意:给出一个n个点的有向图,任意两个点之间都相互到达,求任意两点间最短距离的平均值 因为n很小,所以可以用floyd 建立出图,然后用floyd,统计d[][]不为0且不为INF的边的和及条数,就可以了 做的时候统计边的时候没有加不为0这个条件,改了好久= = 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack&

UVA 11248 - Frequency Hopping(网络流)

UVA 11248 - Frequency Hopping 题目链接 题意:给定一个网络,现在需要从1到N运输流量C,问是否可能,如果可能输出可能,如果不可能,再问是否能通过扩大一条边的容量使得可能,如果可以输出这些边(按u先排再按v排),如果不行输出不可能 思路:先做一遍网络流,然后每次在最小割上进行增加容量,需要两个优化,每次找流量找到>= c就可以了,然后每次修改容量,可以直接从之前做过的网络流继续做即可 代码: #include <cstdio> #include <cst

UVA 821 Page Hopping 网页跳跃(BFS,简单)

题意:给一个无权有向图,可认为边的长度为1,求两点间的平均长度(即所有点对的长度取平均),保留3位小数.保证任意点对都可达. 思路:简单题.直接穷举每个点,进行BFS求该点到其他点的距离.累加后除去边数即可. 1 #include <bits/stdc++.h> 2 #define LL long long 3 #define pii pair<int,int> 4 #define INF 0x7f7f7f7f 5 using namespace std; 6 const int

UVa 821 Page Hopping

题意: 给出一个有向图,求所有路径(两点间的最短路径)的平均值. 分析: 用floyd求两点间的最短距离,然后求平均就好. 代码: #include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;int dist[101][101];int maxn=100000001;int main(){ int a,b,n,cas=1; whil

uva 10803 Thunder Mountain (floyd)

uva 10803 Thunder Mountain 题目大意:给出n个点的坐标,要求n个点每两点之间的最大距离.若这n个点,有不连通的地方,则输出Send Kurdy. 解题思路:Floyd. #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <cstdlib> using namespace std; typedef long

uva 247 Calling Circles(Floyd 的简单应用)

最近在看图论的经典算法, 先看的是求单源最短路的dijkstra,优化后的算法用了优先队列,看起来有点复杂. 感觉 弗洛伊德(Floyd) 要比 迪克斯特拉(dijkstra) 更好理解一点,但是Floyd是三层循环,当然会慢很多.一旦数据开大就跪了吧. floyd可以用来求 两个 连通点间的最短路问题.同时可以得到边权的和,即最短路的长度. 另外一个比较简单的应用,还可以用来判断两点间的连通性.即判断两点是否连通.本题就是弗洛伊德的这种简单用法. #include<cstdio> #incl

UVA 618 - Doing Windows(数论)

题目链接:618 - Doing Windows 题意:给定一个大小不能变的屏幕,和四个大小可以变的窗口,变化要保持长宽比,问这四个窗口能不能调整后全部放下正好填满屏幕,不能重叠 思路:情况一共就几种:4个叠一起,3个叠一起+一个,2个和2个,一个和两个叠一起在一个,把这几种情况全判断了就可以了,判断过程利用gcd,lcm可以求边长. 代码: #include <stdio.h> #include <string.h> long long gcd(long long a, long