拓扑最长路
来源:互联网 发布:七天网络怎样查分 编辑:程序博客网 时间:2024/05/16 00:26
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=941
由于n很小,floyd算法写起来方便,先用这个A了一下:
- /*0.162s*/
- #include<bits/stdc++.h>
- using namespace std;
- const int mx = 105;
- int d[mx][mx];
- void floyd(int n)
- {
- int k, i, j;
- for (k = 1; k <= n; ++k)
- for (i = 1; i <= n; ++i)
- for (j = 1; j <= n; ++j)
- d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
- }
- int main()
- {
- int cas = 0, n, s, i, a, b, dis, to;
- while (scanf("%d%d", &n, &s), n)
- {
- memset(d, 0x3f, sizeof(d));
- for (i = 1; i <= n; ++i) d[i][i] = 0;
- while (scanf("%d%d", &a, &b), a)
- d[a][b] = -1; ///取负值
- floyd(n);
- dis = 0;
- for (i = 1; i <= n; ++i)
- {
- if (d[s][i] < dis)
- {
- dis = d[s][i];
- to = i;
- }
- }
- printf("Case %d: The longest path from %d has length %d, finishing at %d.\n\n", ++cas, s, -d[s][to], to);
- }
- return 0;
- }
然后由于是DAG,于是用拓扑排序A了一下,快的不是一点半点:
- /*0.038s*/
- #include<bits/stdc++.h>
- using namespace std;
- const int mx = 105;
- vector<int> G[mx];
- bool vis[mx];
- int topo[mx], disTo[mx], cnt;
- void dfs(int i)
- {
- vis[i] = true;
- for (int j = 0; j < G[i].size(); ++j) ///对于vector,[0,size())
- if (!vis[G[i][j]]) dfs(G[i][j]);
- topo[cnt++] = i;
- }
- void dagSP(int s)
- {
- int i = cnt, j, v;
- while (topo[--i] != s);
- memset(disTo, 0x3f, sizeof(disTo)); /// 初始化
- disTo[s] = 0;
- for (; i >= 0; --i)
- {
- v = topo[i];
- for (j = 0; j < G[v].size(); ++j) ///注意是以v为主
- disTo[G[v][j]] = min(disTo[G[v][j]], disTo[v] - 1);
- }
- }
- int main()
- {
- int cas = 0, n, s, i, a, b, dis, to;
- while (scanf("%d%d", &n, &s), n)
- {
- for (i = 1; i <= n; ++i) G[i].clear();
- while (scanf("%d%d", &a, &b), a) G[a].push_back(b);
- cnt = 0; /// 最重要的初始化!
- memset(vis, 0, sizeof(vis));
- for (i = 1; i <= n; ++i)
- if (!vis[i]) dfs(i);
- dagSP(s);
- dis = 0;
- for (i = 1; i <= n; ++i)
- {
- if (disTo[i] < dis)
- {
- dis = disTo[i];
- to = i;
- }
- }
- printf("Case %d: The longest path from %d has length %d, finishing at %d.\n\n", ++cas, s, -disTo[to], to);
- }
- return 0;
- }
0 0
- 拓扑最长路
- CSU1830-FarAway-拓扑排序/最长路
- (求DAG图最长路)拓扑排序模板
- POJ1949 Chores 解题报告【拓扑排序/DAG最长路】
- UVa 10000 Longest Paths (单源最长路 - floyd or 拓扑排序)
- 【BZOJ1194】[HNOI2006]潘多拉的盒子【BFS】【SCC】【拓扑排序】【DAG最长路】【自动机】
- HDU 5098 Smart Software Installer 双队列拓扑排序或者DAG的最长路
- 车站分级 (线段树优化建边 拓扑序最长路)
- 【BZOJ1179】【Apio2009】Atm 强连通分量缩点+拓扑DP/拓扑最长路 kosaraju+tarjan+dfs转非递归三种代码
- JZOJ4876. 【NOIP2016提高A组集训第10场11.8】时空传送 拓扑序判断最长路是否合法
- 计蒜客-2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛H题Skiing(拓扑序求DAG最长路)
- ZOJ 3795 Grouping 缩点拓扑序下求最长链
- hdu 5811 Colosseo (拓扑排序 + 最长上升子序列)
- 拓扑排序最长链-P3119 [USACO15JAN]草鉴定Grass Cownoisseur
- 【Codeforces Round 345 (Div 1) C】【并查集缩环+拓扑最长路】Table Compression nm矩形权值缩小大小关系不变
- 拓扑
- 拓扑
- 拓扑
- win8安装.net framework3.5方法
- java对cookie的操作
- [项目管理] 布鲁克斯法则
- mysql导出数据库几种方法
- HDOJ 题目3172Virtual Friends (带权值的并查集,模板)
- 拓扑最长路
- python 基于消息的多进程多线程程序
- Topcoder SRM 600 ORSolitaire
- Linux内核动态调试信息的打开,如pr_debug .
- css减少英文单词字母间的间距
- JAVA中subString以及split函数等几个函数的用法技巧
- 用Python和Pygame写游戏-从入门到精通(7)
- 神奇的js,jQuery.extend 函数详解
- UVa 1644 - Prime Gap