zoukankan      html  css  js  c++  java
  • 41-邮差送信(dfs)

                  邮差送信 (15分)
    C时间限制:1 毫秒 |  C内存限制:3000 Kb
    题目内容:

     有一个邮递员要在n个城市之间来回送信。但有的城市之间有大路相连而有的没有路。
    现在要由一个城市到另一个城市送信,中途最少要经过多少个其它的城市呢?

    输入描述

    第一行是n,k(1<=n<=10000, 1<=k<=20000),接下来就是k行。这k行每行有两个数a,b(1<=a,b<= n),表示城市a和b之间有大路k行以后就是两个数p和q。


    输出描述

    输出从城市p到城市q之间最少要经过的其它的城市的数目。如果p和q之间不连通则输出0


    输入样例

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


    输出样例

    2

    #include <iostream>
    using namespace std;
    int a[100][100]; //存路径 
    int far[100];    //求路径,即存储它的前一个结点 
    int n, m, p, q;  //n个城市, m条路, p起点, q终点 
    int z[1000];     //模拟队列 
    int visit[100];	 //标记是否访问过	
    
    void print(int w){
    	int count = 0;
    //	cout << "w" << w << endl;
    	while(far[w] != p){
    		count++;
    		w = far[w];
    	} 
    	cout << count;
    }
    
    void dfs(){
    	int head = 1, tail = 2;  
    	z[head] = p;
    	visit[p] = 1;
    	int flag = 1;
    	while(head < tail && flag){
    		for(int i = 1; i <= n; i++){
    			if(a[z[head]][i] == 1 && visit[i] == 0){
    				visit[i] = 1;
    				z[tail] = i;
    				tail++;
    				far[i] = z[head];
    				if(i == q){  //找到退出 
    //					cout << "find" << endl;
    					flag = 0;
    					print(i);
    					break;
    				}
    			}
    		}
    		head++;
    	}
    	if(head == tail)	//未找到 
    		cout << 0;
    }
    
    int main(){
    	cin >> n >> m;
    	int x, y;
    	for(int i = 1; i <= m; i++){
    		cin >> x >> y;
    		a[x][y] = a[y][x] = 1; 
    	}
    	cin >> p >> q;
    	dfs();
    	return 0;
    }
    
  • 相关阅读:
    计算十位数以内的数的反数
    用Python做一个简单的小游戏
    Python的发展历史及其前景
    监控相关总结
    前端css学习_Day15
    常用命令总结
    mysql常用命令总结
    Python之Paramiko、前端之html学习_Day14
    Python操作redis、memcache和ORM框架_Day13
    Python连接msyql、redis学习_Day12
  • 原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/7748027.html
Copyright © 2011-2022 走看看