TOJ 4279 Barricade / dijkstra

2024-06-15 12:18
文章标签 dijkstra toj 4279 barricade

本文主要是介绍TOJ 4279 Barricade / dijkstra,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Barricade

时间限制(普通/Java):1000MS/3000MS     运行内存限制:65536KByte
 

描述

GBQC国一共有N个城市,标号分别为1, 2, …, N。N个城市间一共有M条单向通行的道路。

不幸的是,GBQC国的城市1连续暴雨,使得整个城市淹没在汪洋洪水中,于是GBQC国领导人小明决定让城市1的居民暂时移居到城市N,于是一场浩浩荡荡的搬迁运动开始了。

但还有一个问题需要解决,居民从城市1出发,如果走到某个城市时面对多条道路,那么城市1的居民就不知道该往哪个方向走了。

为了解决上述问题,GBQC国领导人决定在一些道路的入口处设置“禁止通行”的路障,以确保城市1的居民从城市1出发,途径每个城市时,都有且仅有一条路可供选择,这样城市1的居民就能顺利搬迁到城市N了。

    现在GBQC国领导人想知道最少需要设置几个路障呢?

输入

输入包含多组测试数据。

对于每组测试数据,第一行包含两个整数N(2<=N<=10^4), M(0<=M<=10^5),其中N、M的含义同上。接下来一共有M行,每行有三个整数x(1<=x<=N)、y(1<=y<=N),表示GBQC国有一条由城市x进入通向城市y的单向道路。

输出

对于每组测试数据,用一行输出一个整数表示最少需要设置几个路障。如果没办法从城市1出发走到城市N,则输出“-1”(不包括引号)。

样例输入

3 4
1 1
1 2
1 3
1 33 2
1 3
3 22 0

样例输出

3
0
-1

将每个点的出度-1作为权值 在求最短路

优先队列优化

#include <stdio.h>
#include <string.h>
#include <queue>
#include <vector>
using namespace std;
struct node
{int end;int dis;bool friend operator <(node a,node b){return a.dis > b.dis;}
};
const int MAX = 10010;
int n,m;
int dis[MAX];
int degree[MAX];
vector <int> v[MAX];
void dijkstra()
{int i;for(i = 1;i <= n; i++)dis[i] = 0x7fffffff;dis[1] = 0;node t;t.end = 1;t.dis = 0;priority_queue <node> q;q.push(t);while(!q.empty()){t = q.top();q.pop();int len = v[t.end].size();for(i = 0;i < len; i++){node tt;int k = v[t.end][i];if(dis[k] > t.dis + v[t.end].size() - 1){dis[k] = t.dis + v[t.end].size() - 1;tt.end = k;tt.dis = dis[k];q.push(tt);}}}
}
int main()
{node x;int s,e,i;while(scanf("%d %d",&n,&m)!=EOF){//memset(degree,0,sizeof())for(i = 1;i <= n; i++)v[i].clear();while(m--){scanf("%d %d",&s,&e);v[s].push_back(e);}dijkstra();if(dis[n] == 0x7fffffff)puts("-1");elseprintf("%d\n",dis[n]);}return 0;
}


 

这篇关于TOJ 4279 Barricade / dijkstra的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1063426

相关文章

poj 1502 MPI Maelstrom(单源最短路dijkstra)

题目真是长得头疼,好多生词,给跪。 没啥好说的,英语大水逼。 借助字典尝试翻译了一下,水逼直译求不喷 Description: BIT他们的超级计算机最近交货了。(定语秀了一堆词汇那就省略吧再见) Valentine McKee的研究顾问Jack Swigert,要她来测试一下这个系统。 Valentine告诉Swigert:“因为阿波罗是一个分布式共享内存的机器,所以它的内存访问

uva 10801(乘电梯dijkstra)

题意: 给几个电梯,电梯0 ~ n-1分别可以到达很多层楼。 换乘电梯需要60s时间。 问从0层到target层最小的时间。 解析: 将进入第0层的电梯60s也算上,最后减。 坑点是如果target为0输出0。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algori

hdu 3790 (单源最短路dijkstra)

题意: 每条边都有长度d 和花费p,给你起点s 终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。 解析: 考察对dijkstra的理解。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstrin

poj 3255 次短路(第k短路) A* + spfa 或 dijkstra

题意: 给一张无向图,求从1到n的次短路。 解析: A* + spfa 或者 dijkstra。 详解见上一题:http://blog.csdn.net/u013508213/article/details/46400189 本题,spfa中,stack超时,queue的效率最高,priority_queue次之。 代码: #include <iostream>#i

【TOJ】2248 Channel Design 最小树形图——朱刘算法

传送门:【TOJ】2248 Channel Design 题目大意:大概意思是需要从水库(编号始终为1)引水到所有的农场(编号2~n),通过m条水管引水直接或间接的得到水(即有边(1,2),(2,3),则说明3能间接的得到水),其中水管是单向的,且每条水管的铺设都需要一定的费用,问要从水库引水到所有的农场的最少花费。如果无解输出impossible。 题目分析:最小树形图模板题。

Dijkstra算法总结

1.如何建立图   Graph 一般是adjecent list, class DirectedGraphNode {     int label;     List<DirectedGraphNode> neighbors;     ... } 也可以使用 HashMap 和 HashSet 搭配的方式来存储邻接表 hashmap<Integer, List<Integer

BFS 到 Level Order traverse 到 UnionFind 到 Topological Sort 到 Dijkstra 思路总结

====BFS 找联通量,找component. Number of Islands (BFS, DFS 都可以做) Surrounded Regions 算法是:先收集四个周边的 O,然后用BFS或者DFS向里面扩展,visited记录connect点,最后如果没有被visited到的O,会变成X;T: O(m*n), Space: O(m*n). Is Graph Bipartite (

HDU1874_畅通工程续(Dijkstra最短路)

畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 23022    Accepted Submission(s): 8085 Problem Description 某省自从实行了很多年的畅通工程计划后,终

算法训练营|图论第8天 拓扑排序 dijkstra

题目: 拓扑排序 题目链接: 117. 软件构建 (kamacoder.com) 代码: #include<bits/stdc++.h>#include<unordered_map>using namespace std;int main() {int n, m;cin >> n >> m;vector<int>inDegree(n, 0);unordered_map<int, v

最短路径算法:迪杰克斯拉(Dijkstra)算法(基于贪心思想)【从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题】【能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低】

Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。 Viterbi和Dijkstra算法看起来比较像,两者的区别: Dijkstra算法适应范围更广。Viterbi算法用在特殊的有向无环图中,而Dijkstra算法可以用在