uestc 方老师的分身 III 拓扑排序

没什么好说的。。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<string>
 6 #include<queue>
 7 #include<algorithm>
 8 #include<map>
 9 #include<iomanip>
10 #include<climits>
11 #include<string.h>
12 #include<cmath>
13 #include<stdlib.h>
14 #include<vector>
15 #define INF 1e7
16 #define MAXN 100010
17 #define maxn 1000010
18 #define Mod 1000007
19 #define N 1010
20 using namespace std;
21 typedef long long LL;
22
23 int n, m;
24 int son[10001];
25 int ans[10001];
26
27 void init()
28 {
29     memset(son,0,sizeof(son));
30     memset(ans,0,sizeof(ans));
31 }
32
33 void process()
34 {
35     vector<int> G[10010];
36     int x, y;
37     init();
38     for (int i = 0; i < m; ++i) {
39         cin >> x >> y;
40         G[y].push_back(x);
41         son[x]++;
42     }
43     queue<int> q;
44     for (int i = 1; i <= n; ++ i)
45         if (son[i] == 0){
46             q.push(i);
47             ans[i] = 888;
48         }
49     int res = 0;
50     while (!q.empty()) {
51         int t = q.front();
52         q.pop();
53         res++;
54         for (int i = 0; i < G[t].size(); ++i) {
55             int v = G[t][i];
56             if (--son[v] == 0) {
57                 ans[v] = ans[t] + 1;
58                 q.push(v);
59             }
60         }
61     }
62     if (res < n) puts("-1");
63     else {
64         int sum = 0;
65         for (int i = 1; i <= n; ++i)
66             sum += ans[i];
67         cout << sum << endl;
68     }
69 }
70
71 int main()
72 {
73     while (cin >> n >> m)
74         process();
75     return 0;
76 }
时间: 2024-11-03 17:29:53

uestc 方老师的分身 III 拓扑排序的相关文章

UESTC 916 方老师的分身III --拓扑排序

做法: 如果有a<b的关系,则连一条a->b的有向边,连好所有边后,找入度为0的点作为起点,将其赋为最小的价值888,然后其所有能到的端点,价值加1,加入队列,删去上一个点,然后循环往复,直到队列为空,即每个点都赋予了一个权值为止. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #in

uestc 方老师的分身IV

类似POJ1386,参考的大神的博客 首先明确思路: 是否为连通图(并查集解决) -> 是否存在欧拉路径  ->  是否存在欧拉回路   (是,则选取字典序最小的输出,否则直接输出可行解) 注意区分有向图和无线图存在欧拉路径或者欧拉回路的条件: 无向图: G为连通图,并且G仅有两个奇度节点或者无奇度节点 推论:1.当G是仅有两个奇度节点的连通图时,G的欧拉通路必以此两个结点为端点 2.当G时无奇度结点的连通图时,G必有欧拉回路 3.G为欧拉图(存在欧拉回路)的充分必要条件是G为无奇度节点的连通

uestc 方老师的分身 II

题意:求s到t走过边数大于k的最短路 思路:邻接表实现,用w[u][e]来维护(看的大牛博客),u表示当前点,e表示已经经过多少条边.感觉有点类似DP. 在边数大于k的处理上,发现还是使之等于k(K<=50),节省存储空间. spfa算法实现. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<string>

cdoj916-方老师的分身 III 【拓扑排序】

http://acm.uestc.edu.cn/#/problem/show/916 方老师的分身 III Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 一天的讲座结束后,方老师的分身们聚在了一起.在合并成一个方老师之前.这些分身要求方老师的真身发糖.这些分身要求方老师至少给他们发888个糖.这还不够,有的分身要求分比另外某个分身的糖多.问方老师最

UESTC 914 方老师的分身I Dijkstra

题意:求有向图的往返最短路的最长长度. 分析:求第一次到所有点的距离可以用一次Dijkstra求最短路求出来.考虑回来的路,想想就知道,从每个点回来的路即为将边的方向反转再求一次最短路后的结果. 所以此题为求两次最短路. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #define Mod 100

UESTC 917 方老师的分身IV --求欧拉路径

判断欧拉路径是否存在及求出字典序最小的欧拉路径问题(如果存在). 将字符串的第一个字母和最后一个字母间连边,将字母看成点,最多可能有26个点(a-z),如果有欧拉路径,还要判断是否有欧拉回路,如果有,则需要找一个字典序最小的点开始生成这条链,否则以起点开始生成链,起点即为出度比入度大1的点. 欧拉路径是否存在的判定: 1.全部点在一个联通块                               ----用并查集判联通块的数量2.所有点出度入度相等                      

UESTC 915 方老师的分身II --最短路变形

即求从起点到终点至少走K条路的最短路径. 用两个变量来维护一个点的dis,u和e,u为当前点的编号,e为已经走过多少条边,w[u][e]表示到当前点,走过e条边的最短路径长度,因为是至少K条边,所以大于K条边的当做K条边来处理就好了.求最短路的三个算法都可以做,我这里用的是SPFA,比较简洁. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #incl

UESTC_方老师的分身 II CDOJ 915

方老师的分身 II Time Limit: 10000/5000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 方老师计算出了走路时间最长的那个分身所用的时间.于是有个特殊的分身(据说是方老师真身!)就不想如此古板的走最短路了!由于这个分身的特殊性,这个分身对于单向边可以当双向边走.但是这个特殊的分身想走最短路的同时,要求至少经过k条边. Input 有多组数据 第一行两个整数n,m(1≤n

uestc 方老师和缘分

关于怎么建图,自己还真是想不出来. 我觉得就是找到每个方老师所在的scc里的所有缘分吧.. 转自http://www.cnblogs.com/whatbeg/p/3765621.html 做法:建图,每个方老师和它想要的缘分之间连一条有向边,然后,在给出的初始匹配中反向建边,即如果第i个方老师现在找到的是缘分u,则建边u->i.这样求出所有的强连通分量,每个强连通分量中方老师和缘分的数目一定是相等的,所以每个方老师一定可以找到与他在同一个强连通分量里的缘分,因为强连通分量中每个点都是可达的,某个