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;
- }