【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<stack>
#include<queue>
#include<map>
#include<set>
#include<list>
#include<cmath>
#include<string>
#include<sstream>
#include<ctime>
using namespace std;
#define _PI acos(-1.0)
#define INF (1 << 10)
#define esp 1e-9
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> pill;
/*===========================================
===========================================*/
#define MAXD 100 + 10
int G[MAXD][MAXD];
int main(){
    int a , b;
    int Case = 1;
    while(scanf("%d%d",&a,&b)){
        if(!a && !b) break;
        for(int i = 1 ; i <= 100 ; i++)
            for(int j = 1; j <= 100 ; j++)
                if(i == j) G[i][j] = 0;
                else       G[i][j] = INF;
        map<int,int>vis;
        vector<int>node;
        G[a][b] = 1;
        while(scanf("%d%d",&a,&b)){
            if(!a && !b) break;
            G[a][b] = 1;
            if(!vis.count(a)){
                node.push_back(a);
                vis[a] = 1;
            }
            if(!vis.count(b)){
                node.push_back(b);
                vis[b] = 1;
            }
        }
        for(int k = 0 ; k < node.size() ; k++)
            for(int i = 0 ; i < node.size() ; i++)
                for(int j = 0 ; j < node.size() ; j++)
                    if(G[node[i]][node[k]] < INF && G[node[k]][node[j]] < INF)
                        G[node[i]][node[j]] = min(G[node[i]][node[j]],G[node[i]][node[k]] + G[node[k]][node[j]]);
        int sum = 0;
        for(int i = 0 ; i < node.size() ; i++)
            for(int j = 0 ; j < node.size() ; j++){
                sum += G[node[i]][node[j]];
            }
        double ans = 1.0 * sum / ((node.size() -1)* node.size());
        printf("Case %d: average length between pages = %.3f clicks\n",Case++,ans);
    }
    return 0;
}

【UVA】821-Page Hopping(Floyd)

时间: 2024-12-24 16:37:41

【UVA】821-Page Hopping(Floyd)的相关文章

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,in

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】247 - Calling Circles(floyd判断包闭,dfs输出)

最近状态不佳,总是爱犯低级错误,比较水的题,没什么需要讲得,要说的可能是floyd判断包闭吧 void Floyd() { for(int k=1; k<=n; k++) for(int i=1; i<=n; i++) if(map[i][k]) for(int j=1; j<=n; j++) if(map[k][j]) map[i][j] = 1; } 之前做了不少图论,图论周感觉能应付的过去. 14059727 247 Calling Circles Accepted C++ 0.0

【UVA】10404-Bachet&#39;s Game(动态规划)

如果d[i]是必胜态,那么d[i + V[j]]一定是必败态,反之亦然. 用d[i]代表棋子为i个是否为必胜态. 边界条件是d[i] = 1; 14139291 10404 Bachet's Game Accepted C++ 0.662 2014-09-03 09:44:48 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vecto

【UVA】11181 - Probability|Given(条件概率)

一道条件概率题,数学烂真的伤不起,一开始都不知道怎么求条件概率. P(e) = p(e|E)/p(E). 用e出现的情况的概率,除以所有情况出现的概率,递归枚举每个人是否买东西了. 14026058 11181 Probability|Given Accepted C++ 0.102 2014-08-12 08:25:51 效率可能有点差. #include<cstdio> #include<cstring> #include<iostream> #include<

【UVa】Partitioning by Palindromes(dp)

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=27&page=show_problem&problem=2549 设w[i,j]为i-j能分割成的最少回文串 f[i]为前i个字符能够分成的最少回文串 w[i,j]=1 当w[i+1,j-1]==1 && s[i]==s[j] 或 i==j-1 && s[i]==s[j] w[i,j]=

【UVA】11796 - Dog Distance(相对运动)

因为a,b是同时出发,同时达到,但是他们的速度不一定一样,所以我们可以设他们的速度为La,Lb(La,Lb为a,b狗的总路程) 那么,如何a,b都是沿着直线运动的时候如何求他们之间的最短最长距离呢? 因为运动都是相对的,所以我们可以把a看成不懂的,而b相对于a的移动方向就是Vb - Va,因此就可以看成a和线段 b + (Vb -Va)之间的关系了 至于方向Va,Vb向量怎么求,我们可以利用单位向量 X 移动时间 X 移动速度 得到. 经典的一道题,顺便还修复了一个模板的BUG: 1412818

【题解】灾后重建——(floyd)

这道题告诉我,背的掉板子并不能解决一切问题,理解思想才是关键,比如不看题解,我确实想不清楚这题是弗洛伊德求最短路 (我不该自不量力的说我会弗洛伊德了我错了做人果然要谦虚) 灾后重建 题目背景 B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重建完成的村庄的公路才能通车,只能到达重建完成的村庄. 题目描述 给出B地区的村庄数N,村庄编号从0到N-1,和所有M条公路的长度,公路是双向

【UVa】439 Knight Moves(dfs)

题目 题目 ? ? 分析 没有估价函数的IDA...... ? ? 代码 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int q,dx[10]={2,2,-2,-2,1,-1,1,-1},dy[10]={1,-1,1,-1,2,2,-2,-2},ans=1<<15; bool vis[11][11]; int x1,y1,x2,y2; bool

【UVa】1600 Patrol Robot(dfs)

题目 题目 ? ? 分析 bfs可以搞,但是我还是喜欢dfs,要记忆化不然会T ? ? 代码 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int INF=1<<25; int k,n,m,map[25][25],dx[10]={1,-1,0,0},dy[10]={0,0,1,-1},ans; int vis[25][25][25];