zoukankan      html  css  js  c++  java
  • Problem: 最短路上的统计

    Problem: 最短路上的统计

    Problem: 最短路上的统计

    Time Limit: 1 Sec  Memory Limit: 128 MB
    [Submit][Status][Web Board]

    Description

    一个无向图上,没有自环,所有边的权值均为1,对于一个点对(a,b)
    我们要把所有a与b之间所有最短路上的点的总个数输出。

    Input

    第一行n,m,表示n个点,m条边
    接下来m行,每行两个数a,b,表示a,b之间有条边
    在下来一个数p,表示问题的个数
    接下来p行,每行两个数a,b,表示询问a,b
    n<=100,p<=5000

    Output

    对于每个询问,输出一个数c,表示a,b之间最短路上点的总个数

    Sample Input

    5 6
    1 2
    1 3
    2 3
    2 4
    3 5
    4 5
    3
    2 5
    5 1
    2 4

    Sample Output

    4
    3
    2

    HINT

    floyd

    [Submit][Status]
    #include<stdio.h>
    #include<string.h>
    int n,m,a,b,p,w[101][101];
    int main() {
    	scanf("%d %d",&n,&m);
    	memset(w,1,sizeof(w));
    	for(int i=0; i<m; i++) {
    		scanf("%d %d",&a,&b);
    		w[a][b]=w[b][a]=1;
    	}
    	for(int d=1; d<=n; d++) //枚举中间点
    		for(int i=1; i<=n; i++) //枚举起点
    			for(int j=1; j<=n; j++) //枚举终点
    				if(w[i][d]!=0x1010101&&w[d][j]!=0x1010101&&w[i][d]+w[d][j]<w[i][j])
    					w[i][j]=w[i][d]+w[d][j];
    	/*
    	 *先算出两点之间的最短路
    	 *再算a,b之间最短路上点的总个数
    	 */
    	scanf("%d",&p);
    	for(int i=0; i<p; i++) {
    		int ans=2;
    		scanf("%d %d",&a,&b);
    		for(int d=1; d<=n; d++) //枚举中间点
    			if(d!=a&&d!=b&&w[a][d]+w[d][b]==w[a][b]) //判断是否为最短路
    				ans++;
    		printf("%d
    ",ans);
    	}
    }
    
  • 相关阅读:
    linux定时任务
    php与xpath使用操作文本节点
    php处理图片实现
    Yii源码阅读笔记
    Yii源码阅读笔记
    Yii源码阅读笔记
    Yii源码阅读笔记
    Yii源码阅读笔记
    Yii源码阅读笔记
    Yii源码阅读笔记
  • 原文地址:https://www.cnblogs.com/ZhaoChongyan/p/11740393.html
Copyright © 2011-2022 走看看