zoukankan      html  css  js  c++  java
  • 洛谷P1144: 最短路计数(bfs)

    题目描述

    给出一个N个顶点M条边的无向无权图,顶点编号为1−N。问从顶点1开始,到其他每个点的最短路有几条。

    输入输出格式

    输入格式:

    第一行包含2个正整数N,M为图的顶点数与边数。

    接下来M行,每行2个正整数x,y,表示有一条顶点x连向顶点y的边,请注意可能有自环与重边。

    输出格式:

    共N行,每行一个非负整数,第iii行输出从顶点1到顶点i有多少条不同的最短路,由于答案有可能会很大,你只需要输出ansmod100003 后的结果即可。如果无法到达顶点i则输出0。

    输入输出样例

    输入样例#1: 复制

    5 7
    1 2
    1 3
    2 4
    3 4
    2 3
    4 5
    4 5
    

    输出样例#1: 复制

    1
    1
    1
    2
    4
    

    说明

    1到5的最短路有4条,分别为2条1−2−4−5和222条1−3−4−5(由于4−5的边有2条)。

    对于20%的数据,N≤100;

    对于60%的数据,N≤1000;

    对于100%的数据,N<=1000000,M<=2000000;

    解题思路:

    遍历所有的边,如果该点还未被访问,证明是一条最短路,存储下最短路径,如果已经被访问且路径的长度等于最短路径,证明这是另一条最短路。

    #include <stdio.h>
    #include <queue>
    #include <vector>
    #include <string.h>
    #define N 1000020
    using namespace std;
    vector<int>e[N];
    queue<int>q;
    int book[N], dis[N], ans[N];
    int main()
    {
    	int n, m, i, u, v;
    	while(scanf("%d%d", &n, &m)!=EOF)
    	{
    		memset(book, 0, sizeof(book));
    		memset(ans, 0, sizeof(ans));
    		for(i=1; i<=m; i++)
    		{
    			scanf("%d%d", &u, &v);
    			e[u].push_back(v);
    			e[v].push_back(u);
    		}
    		q.push(1);
    		book[1]=1;
    		ans[1]=1;
    		while(!q.empty())
    		{
    			u=q.front();
    			q.pop();
    			for(i=0; i<e[u].size(); i++)
    			{
    				v=e[u][i];
    				if(!book[v])
    				{
    					dis[v]=dis[u]+1;
    					book[v]=1;
    					q.push(v);	
    				}
    				if(dis[v]==dis[u]+1)
    					ans[v]=(ans[v]+ans[u])%100003;
    			}
    		}
    		for(i=1; i<=n; i++)
    			printf("%d
    ", ans[i]);
    	}
    	return 0;
    }
  • 相关阅读:
    自我介绍
    自动生成小学生四则运算(C语言)
    黄金点游戏
    7/5linux命令(整理中)
    第二章内容及作业
    第三章笔记
    第一章作业
    第一阶段笔记整理7.23
    第三章课后作业
    7/6linux命令
  • 原文地址:https://www.cnblogs.com/zyq1758043090/p/11852608.html
Copyright © 2011-2022 走看看