zoukankan      html  css  js  c++  java
  • 40-圣诞广场(最短路径与最长路径)

    C时间限制:3000 毫秒 |  C内存限制:3000 Kb
    题目内容:
    Angel最近无聊,去了圣诞岛(CX *^_^*),他喜欢无目的的乱逛,当然,他不会轻易地回头。Angel想
    
    去广场,那么,他什么时候才能到呢?你已经得到了CX的地图,地图上有N(N <= 100)个交叉路口,交
    
    叉路口之间有马路相连接(不超过1000条马路)。因为CX的人遵循奇怪的规则,道路都是单向的,不同
    
    的道路之间有一定的距离,我们假设Angel所在的地点为点1,广场所在点为N。假设Angel走一单位距
    
    离需要一单位时间。问Angel最早和最迟什么时候到达广场? 
    输入描述
    本题有多组数据,第一行N, M,M是边的数量,以后M行,每行3个整数X, Y, Weight,代表一条从X
    
    城市到Y城市,长度为Wweight的边。
    

    输出描述
    每组数据,第一行是最少时间,第二行是最迟时间,要是可怜的Angel可能永远到不了广场,输
    
    出一行Never。
    

    输入样例
    5 5
    1 2 1
    1 4 10
    2 3 1
    3 4 1
    4 5 1

    输出样例
    4
    11

    //思路:最短路径是迪杰斯特拉,最长路径可以要关键路径来写,不会,用迪杰斯特拉倒着水过了*^_^*
    #include <iostream>
    #include <cstring>
    #define INFINITE  10000000
    using namespace std;
    int n, m; 		  //n个点,m条路
    int a[100][100];  //权值矩阵 
    int dist[100];    //距离 
    int pre[100];
    
    int  pathDijkstra(int n, int s){  //s为源点 
    	int i, j, k, count;
    	int boolInA[100];
    	int minpnt, mindis;
    	for(int i = 1; i <= n; i++){
    		dist[i] = a[s][i];
    		pre[i] = s;
    		boolInA[i] = 0;
    	} 
    	boolInA[s] = 1;
    	for(count = 1; count <= n; count++){
    		mindis = INFINITE;
    		for(i = 1; i <= n; i++){
    			if(!boolInA[i] && mindis > dist[i]){
    				mindis = dist[i];
    				minpnt = i;
    			}
    		}
    		boolInA[minpnt] = 1;
    		for(int i = 1; i <= n; i++)
    			if(!boolInA[i] && dist[i] > dist[minpnt] + a[minpnt][i]){
    				dist[i] = dist[minpnt] + a[minpnt][i];
    				pre[i] = minpnt;
    			}
    	}
    	cout << dist[5] << endl;
    	return 1;
    }
    int  fpathDijkstra(int n, int s){  //s为源点  水过的 *^_^* 
    	int i, j, k, count;
    	int boolInA[100];
    	int minpnt, mindis;
    	for(int i = 1; i <= n; i++){
    		dist[i] = a[s][i];
    		pre[i] = s;
    		boolInA[i] = 0;
    	} 
    	boolInA[s] = 1;
    	for(count = 1; count <= n; count++){
    		mindis = -1;
    		for(i = 1; i <= n; i++){
    			if(!boolInA[i] && mindis <= dist[i]){    //加了个= 
    				mindis = dist[i];
    				minpnt = i;
    			}
    		}
    		boolInA[minpnt] = 1;
    		for(int i = 1; i <= n; i++)
    			if(!boolInA[i] && dist[i] < dist[minpnt] + a[minpnt][i]){
    				dist[i] = dist[minpnt] + a[minpnt][i];
    				pre[i] = minpnt;
    			}
    	}
    	cout << dist[5] << endl;
    	return 1;
    } 
    
    int main(){
    	cin >> n >> m;
    	int x, y, v;
    //	int j;
    	for(int i = 1; i <= n; i++){
    		for(int j = 1; j <= n; j++){
    			a[i][j] = INFINITE;
    			if(i == j)
    				a[i][i] = 0;		
    		}
    	} 
    	for(int i = 1; i <= m; i++){
    		cin >> x >> y >> v;
    		a[x][y] = v;
    	}
    	pathDijkstra(n, 1);
    	for(int i = 1; i <= n; i++){
    		for(int j = 1; j <= n; j++){
    			if(a[i][j] == INFINITE)
    				a[i][j] = -1;		
    		}
    	}
    	fpathDijkstra(n, 1);
    //	for(int i = 1; i <= n; i++)
    //		cout << dist[i] << " ";
    	
    	return 0;
    }
    
  • 相关阅读:
    网站微信登录-python 实现
    最终还是迁移到github
    理解 python 装饰器
    Git 学习之 Git Basics
    haskell 常用 函数
    jinja 2 filter 使用
    目标的牵引作用
    姨妈去世了
    OKR的理解
    无法证明的事情,和梦又有什么区别呢
  • 原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/7748017.html
Copyright © 2011-2022 走看看