CSUOJ 1256 天朝的单行道(最短路)
来源:互联网 发布:淘宝澳洲站 编辑:程序博客网 时间:2024/05/01 22:34
1256: 天朝的单行道
Description
在另一个平行宇宙中,有一个神奇的国度名叫天朝。天朝一共有N个城市(标号分别为1, 2, …, N),M条道路,为了方便交通管制,天朝的M条道路都是单行道。
不久前天朝大选,小Q当选了天朝的总统。小Q家住在城市1,但天朝的办公地点在城市N,于是为了便于工作,小Q决定举家从城市1搬迁到城市N去居住。然而小Q惊奇的发现,现在并不存在从城市1出发到城市N路线。
但这点难题是无法阻挡天朝总统的,小Q决定行使总统的权利下令更改一些道路的通行方向,使得至少存在一条从城市1出发到城市N的路线,但为了节省时间和资源,他希望更改通行方向的道路尽可能少,你能帮帮小Q吗?
Input
输入包含多组测试数据。
对于每组测试数据,第一行包含两个正整数N (2<=N<=5000)、M (1<=M<=10000),表示天朝一共有N个城市、M条道路。接下来M行每行有两个正整数u、v (1<=u, v<=N),表示城市u和城市v之间有一条通行方向为u->v的单行道。两个城市之间可能有多条道路。
Output
对于每组测试数据,用一行输出一个整数表示最少需要更改多少条单行道的通行方向,才能使得至少存在一条路线能够让小Q从城市1出发到城市N。
如果没办法使得至少存在一条路线让小Q从城市1出发到城市N,则输出“-1”(不包括引号)。
Sample Input
2 11 22 12 12 0
Sample Output
01-1
解题思路:对于每一条u -> v,建立一条权值为1的v -> u的反向边,然后求1 -> N的最短路即可。(一直TLE,调试了半天,发现是边数的问题。。话说这道题Dijkstra比SPFA慢。。)代码如下:
SPFA
#include <bits/stdc++.h>#define INF INT_MAX / 10#define MEM(arr,val) memset(arr,val,sizeof(arr))using namespace std;const int maxn = 5005;const int maxm = 20010;bool inque[maxn];int ft[maxn],d[maxn],e;int nt[maxm],v[maxm],w[maxm];int n,m;void init(){ e = 1; MEM(ft,-1); MEM(inque,0);}void add_edge(int from,int to,int cost){ v[e] = to; nt[e] = ft[from]; w[e] = cost; ft[from] = e++;}queue<int> que;void spfa(int s){ while(que.size()) que.pop(); for(int i = 0;i <= n;i++) d[i] = INF; d[s] = 0; inque[s] = 1; que.push(s); while(que.size()){ int u = que.front(); que.pop(); inque[u] = 0; for(int i = ft[u];i != -1;i = nt[i]){ if(d[v[i]] > d[u] + w[i]){ d[v[i]] = d[u] + w[i]; if(!inque[v[i]]){ que.push(v[i]); inque[v[i]] = 1; } } } }}int main(){ while(~scanf("%d %d",&n,&m)){ int x,y; init(); while(m--){ scanf("%d %d",&x,&y); add_edge(x,y,0); add_edge(y,x,1); } spfa(1); printf("%d\n",d[n] == INF ? -1 : d[n]); } return 0;}
Dijkstra
#include <bits/stdc++.h>#define INF INT_MAX / 10#define MEM(arr,val) memset(arr,val,sizeof(arr))using namespace std;const int maxn = 5005;const int maxm = 20010;typedef pair<int,int> P;int ft[maxn],d[maxn],e;int nt[maxm],v[maxm],w[maxm];int n,m;void init(){ e = 1; MEM(ft,-1);}void add_edge(int from,int to,int cost){ v[e] = to; nt[e] = ft[from]; w[e] = cost; ft[from] = e++;}priority_queue<P,vector<P>,greater<P> > que;void dijkstra(int s){ while(que.size()) que.pop(); for(int i = 0;i <= n;i++) d[i] = INF; d[s] = 0; que.push(P(0,s)); while(que.size()){ P p = que.top(); que.pop(); int u = p.second; if(d[u] < p.first) continue; for(int i = ft[u];i != -1;i = nt[i]){ if(d[v[i]] > d[u] + w[i]){ d[v[i]] = d[u] + w[i]; que.push(P(d[v[i]],v[i])); } } }}int main(){ while(~scanf("%d %d",&n,&m)){ int x,y; init(); while(m--){ scanf("%d %d",&x,&y); add_edge(x,y,0); add_edge(y,x,1); } dijkstra(1); printf("%d\n",d[n] == INF ? -1 : d[n]); } return 0;}
0 0
- CSUOJ 1256 天朝的单行道(最短路)
- 天朝的单行道+csuoj+spfa算法求最短路
- CSU 1256 天朝的单行道 最短路问题
- CSU - 1256 天朝的单行道
- CSU 1256 天朝的单行道
- coj 1256 天朝的单行道
- CSU1256(天朝的单行道)
- CSU1256 天朝的单行道(spfa)
- CSUOJ 1808 地铁(最短路)
- CSUOJ 1891 Full Tank? 最短路 bfs
- CSUOJ 1891 Full Tank? 有约束条件下的最短路 分支限界法?
- 最短的名字+csuoj+前缀树(字典树)
- CSUOJ 1829 Dungeon 最短路 BFS 预处理 增加维数
- 最短路(最短路)
- [容易] 最短路实例(有条件的最短路)
- poj2387(最简单的最短路)
- 【POJ】3463 Sightseeing 最短路+比最短路大一的路(最短路 or 最短路+DP)
- CSUOJ 1945 最简单的题目 背包问题
- JQueryUI Chosen插件
- 四元数、欧拉角及方向余弦矩阵的相互转换公式
- ApplicationContextAware 获取Spring 上下文
- RS232&TTL
- Android Audio系列 AudioPatch的bug
- CSUOJ 1256 天朝的单行道(最短路)
- angularjs·的使用:指令(3)
- 【e医疗原创】如何做好以数字签名为基础的医疗信息安全性管理
- web前端入坑:web前端到底怎么学?干货资料!
- Grid表中 组合框显示 displayField
- c语言,fclose()带来的内存错误(求解)
- java exception 和 runtimeException的区别
- EL表达式
- mysql EF6.0 报错:“ Guid 字符串只应包含十六进制字符。”