首页 > 其他 > 详细

UVa 10000 Longest Paths (单源最长路 - floyd or 拓扑排序)

时间:2014-02-17 01:26:14      阅读:473      评论:0      收藏:0      [点我收藏+]

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

UVa 10000 Longest Paths (单源最长路 - floyd or 拓扑排序)

原文:http://blog.csdn.net/synapse7/article/details/19283885

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!