CSU 1256 天朝的单行道

题目来源:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1256

一个完全单向的有向图,最少更改多少条边能够从1到N。把原有的边的权值设为0,换方向的边的权值设为1。

简历邻接表。add_edge(u,v,0);add_edge(v,u,0);采用SPFA算法求出1->N权值最小的情况,即为要更改多少

条边,注意最多的边数是2*10000而不是10000,因为这个居然TE,真是奇怪,到最后找了好久才找到这个错误。

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<queue>
 4 #define INF 0x3f3f3f3f
 5 const int maxn=5000+5,maxm=20000+5;
 6 int first[maxn],next[maxm],v[maxm],w[maxm],dist[maxn],numedge;
 7 bool done[maxn];
 8 void add_edge(int a,int b,int c)
 9 {
10     v[numedge]=b;
11     next[numedge]=first[a];
12     first[a]=numedge;
13     w[numedge]=c;
14     numedge++;
15 }
16 void spfa(void)
17 {
18     std::queue<int>q;
19     q.push(1);
20     done[1]=true;
21     while(!q.empty()){
22         int a=q.front();
23         q.pop();
24         done[a]=false;
25         for(int e=first[a];e!=-1;e=next[e]){
26             if(dist[v[e]]>dist[a]+w[e]){
27                 dist[v[e]]=dist[a]+w[e];
28                 if(!done[v[e]]){
29                     q.push(v[e]);
30                     done[v[e]]=true;
31                 }
32             }
33         }
34     }
35 }
36 int main()
37 {
38     int n,m;
39     while(scanf("%d%d",&n,&m)!=EOF){
40         memset(first,-1,sizeof(int)*(n+1));
41         numedge=1;
42         int a,b;
43         for(int e=1;e<=m;e++){
44             scanf("%d%d",&a,&b);
45             add_edge(a,b,0);
46             add_edge(b,a,1);
47         }
48         memset(done,false,sizeof(bool)*(n+1));
49         for(int i=1;i<=n;i++)
50             dist[i]=(i==1?0:INF);
51         spfa();
52         if(dist[n]>=INF)
53             printf("-1\n");
54         else
55             printf("%d\n",dist[n]);
56     }
57     return 0;
58 }

CSU 1256 天朝的单行道,布布扣,bubuko.com

时间: 2024-10-13 10:19:27

CSU 1256 天朝的单行道的相关文章

CSUOJ 1256 天朝的单行道

题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1256 题目大意: 在另一个平行宇宙中,有一个神奇的国度名叫天朝.天朝一共有N个城市(标号分别为1, 2, …, N),M条道路,为了方便交通管制,天朝的M条道路都是单行道. 不久前天朝大选,小Q当选了天朝的总统.小Q家住在城市1,但天朝的办公地点在城市N,于是为了便于工作,小Q决定举家从城市1搬迁到城市N去居住.然而小Q惊奇的发现,现在并不存在从城市1出发到城市N路线. 但这点难题是无

CSU 1256

1256: 天朝的单行道 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 159  Solved: 46[Submit][Status][Web Board] Description 在另一个平行宇宙中,有一个神奇的国度名叫天朝.天朝一共有N个城市(标号分别为1, 2, …, N),M条道路,为了方便交通管制,天朝的M条道路都是单行道. 不久前天朝大选,小Q当选了天朝的总统.小Q家住在城市1,但天朝的办公地点在城市N,于是为了便于工作,小Q决定举家从

CSU 1804: 有向无环图(拓扑排序)

http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1804 题意:…… 思路:对于某条路径,在遍历到某个点的时候,之前遍历过的点都可以到达它,因此在这个时候对答案的贡献就是∑(a1 + a2 + a3 + ... + ai) * bv,其中a是之前遍历到的点,v是当前遍历的点. 这样想之后就很简单了.类似于前缀和,每次遍历到一个v点,就把a[u]加给a[v],然后像平时的拓扑排序做就行了. 1 #include <bits/stdc++.h>

CSU 1111: 三家人【有趣的思维题】

1111: 三家人 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 2241  Solved: 874 [Submit][Status][Web Board] Description 有三户人家共拥有一座花园,每户人家的太太均需帮忙整理花园.A 太太工作了5 天,B 太太则工作了4 天,才将花园整理完毕.C 太太因为正身怀六甲无法加入她们的行列,便出了90元.请问这笔钱如何分给A.B 二位太太较为恰当?A 应得多少元?90/(5+4)*5=$50

CSU 1112: 机器人的指令【模拟题】

1112: 机器人的指令 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 1858  Solved: 682 [Submit][Status][Web Board] Description 数轴原点有一个机器人.该机器人将执行一系列指令,你的任务是预测所有指令执行完毕之后它的位置. ·LEFT:往左移动一个单位 ·RIGHT: 往右移动一个单位 ·SAME AS i: 和第i 条执行相同的动作.输入保证i 是一个正整数,且不超过之前执行指令数 In

CSU 1416 Practical Number

原题链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1416 结论题,具体判断方法请点击这个网址. 筛素数是肯定的,但一开始定的范围太大了,想当然要筛到10^9的质数,但仔细想想,只要到sqrt(10^9)就可以了,最后的那一个质数是最后一步的比较,不用筛出来. #include <stdio.h> #include <string.h> #include <iostream> using namespace st

CSU 1412 Line and Circles

原题链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1412 题目要求判断是否有一条直线可以穿过所有的圆. 做法:把所有圆心做一次凸包,然后判断这个凸包是否能通过一个宽度为2*R的通道. 做法和求凸包直径差不多,只是判断的时候把点到两个端点的距离换成点到直线的距离. #include <stdio.h> #include <string.h> #include <math.h> #include <stdli

CSU 1547 Rectangle(dp、01背包)

题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1547 Description Now ,there are some rectangles. The area of these rectangles is 1* x or 2 * x ,and now you need find a big enough rectangle( 2 * m) so that you can put all rectangles into it(th

next_permutation,POJ(1256)

题目链接:http://poj.org/problem?id=1256 解题报告: 1.sort函数是按照ASC11码排序,而这里是按照 'A'<'a'<'B'<'b'<...<'Z'<'z'排序. #include <iostream> #include <algorithm> #include <string> using namespace std; bool cmp(char a,char b) { char m=tolowe