zoukankan      html  css  js  c++  java
  • 九度 1545:奇怪的连通图

    题目描述

    总结

    1. 用 BFS 实现 Dijkstra. 要点是, visited 后标记, 把某个点从优先队列取出后再标记

    代码 未通过九度测试 RE

    /*
     * source.cpp
     *
     *  Created on: 2014-4-4
     *      Author: vincent
     */
    
    #include <iostream>
    #include <stdio.h>
    #include <queue>
    #include <vector>
    #include <memory.h>
    using namespace std;
    
    class GraphNode {
    public:
    	int index;
    	int dis;
    	GraphNode(int _index, int _dis):index(_index), dis(_dis) {
    	}
    	GraphNode() {
    		GraphNode(0, 0);
    	}
    };
    
    class QueueNode {
    public:
    	int index;
    	int dis;
    	QueueNode(int _index, int _dis):index(_index), dis(_dis) {}
    	QueueNode() {
    		QueueNode(0, 0);
    	}
    	bool operator <(const QueueNode &other) const {
    		return this->dis > other.dis;
    	}
    };
    const int INF = 0X3F3F3F3F;
    vector<GraphNode> graph[10100];
    bool visited[10100];
    
    int main() {
    	int vertex, edge;
    	freopen("input.txt", "r", stdin);
    
    	while(scanf("%d%d", &vertex, &edge) != EOF) {
    		for(int i = 0; i <= vertex; i++)
    			graph[i].clear();
    
    		memset(visited, 0, sizeof(visited));
    		int m, n, k;
    		for(int i = 0; i < edge; i ++) {
    			scanf("%d%d%d", &m, &n, &k);
    			graph[m].push_back(GraphNode(n, k));
    			graph[n].push_back(GraphNode(m, k));
    		}
    		priority_queue<QueueNode> record;
    		record.push(QueueNode(1, 0));
    		visited[1] = true;
    
    		int minK = INF;
    		while(!record.empty()) {
    			QueueNode qNode = record.top();
    			record.pop();
    
    			if(qNode.index == vertex) {
    				minK = qNode.dis;
    				visited[qNode.index] = 1;
    				break;
    			}
    
    			int index = qNode.index;
    			for(size_t i = 0; i < graph[index].size(); i ++) {
    				int j = graph[index][i].index;
    				if(visited[j])continue;
    
    				record.push(QueueNode(j, max(qNode.dis, graph[index][i].dis)));
    			}
    		}
    
    		if(visited[vertex] == 0) {
    			printf("-1
    ");
    		}else {
    			printf("%d
    ", minK);
    		}
    	}
    	return 0;
    }
    

      

    SPFA Solution WA

    #include <iostream>
    #include <stdio.h>
    #include <memory.h>
    #include <algorithm>
    #include <vector>
    #include <map>
    #include <set>
    #include <string>
    #include <deque>
    #include <cstring>
    #define MIN(x,y) (x)<(y)?(x):(y)
    using namespace std;
    
    class Node  {
    public:
    	int index;
    	int cost;
    
    	Node()  {
    		index = cost = -1;
    	}
    
    	Node(int _index, int _cost):index(_index), cost(_cost) {}
    };
    
    vector<Node> graph[10010];
    int dist[10010];
    
    
    int spfa(int m)  {
    	deque<int> record;
    	memset(dist, 0x3f, sizeof(dist));
    	set<int> visited;
    
    	record.push_back(1);
    	visited.insert(1);
    	dist[1] = 0;
    
    	while(!record.empty())  {
    		int fat = record.front();
    		record.pop_front();
    		
    
    		for(int i = 0; i < graph[fat].size(); i ++)  {
    			Node child = graph[fat][i];
    			int child_index = child.index;
    			int child_cost = child.cost;
    
    			if(max(dist[fat],child_cost) < dist[child_index]) {
    				dist[child_index] = max(dist[fat], child_cost);
    
    				if(visited.count(child_index)) continue;
    				record.push_back(child_index);
    				visited.insert(child_index);
    			}
    		}
    
    	}
    
    	if(dist[m] == 0x3f3f3f3f)
    		return -1;
    	return dist[m];
    
    }
    
    int main() {
    	freopen("C:\Users\vincent\Dropbox\workplacce\joj\test.txt", "r", stdin);
    	
    	int m, n;
    	while(scanf("%d%d", &m, &n) != EOF)  {
    		for(int i = 1; i <= m; i ++)  {
    			graph[i].clear();
    		}
    
    		int from, to, cost;
    		for(int i = 0; i < n; i ++)  {
    			scanf("%d%d%d", &from, &to, &cost);
    			graph[from].push_back(Node(to, cost));
    			graph[to].push_back(Node(from, cost));
    		}
    
    		int res = spfa(m);
    		printf("%d
    ", res);
    	}
    
    	return 0;
    }
    

      

  • 相关阅读:
    js-20170816-Date对象
    js-20170804-Math对象
    js-20170619-string对象
    微信web开发者工具
    前端开发指南
    接口调试工具DHC
    CSS预处理器
    Weex
    Vue.js
    hbuilder
  • 原文地址:https://www.cnblogs.com/zhouzhuo/p/3645826.html
Copyright © 2011-2022 走看看