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