设为首页 加入收藏

TOP

PKU 1511 Invitation Cards (SPFA+邻接表)
2014-11-23 21:54:11 来源: 作者: 【 】 浏览:6
Tags:PKU 1511 Invitation Cards SPFA 邻接

题目需要求从原点到所有点的最短距离之和和所有点到原点的最短距离之和,在求所有点到原点最短距离的时候用到了一个技巧:即把图反向,求原点到所有其他点的最短距离,这样用一次SPFA就可以将所有点到原点的最短距离求出来了。

另外也没什么好说的,纯SPFA。另外用优化到VlogE的dijkstra貌似也能过,有空的时候再写个。

代码如下:

#include 
#include 
#include 
#include 
#include 
using namespace std;

#define MAX 1000009
#define INF 1<<30
struct ENode 
{
	int to, cost, next;
} enode[MAX * 4];

int NE = 0;
int OriginHead[MAX], RevHead[MAX];
int dist[MAX];

void insertEdge( int from, int to, int cost )
{
	enode[NE].cost = cost; enode[NE].to = to; enode[NE].next = OriginHead[from]; OriginHead[from] = NE++;
	enode[NE].cost = cost; enode[NE].to = from; enode[NE].next = RevHead[to]; RevHead[to] = NE++;
}

void initDist( int n )
{
	for (int i=0; i<=n; i++) dist[i] = INF;
	dist[1] = 0;
}

int inQueue[MAX];
queue Q;
void SPFA( int *Head )
{
	inQueue[1] = 1;
	Q.push(1);
	while ( ! Q.empty() )
	{
		int q = Q.front();
		Q.pop();
		inQueue[q] = 0;
		for ( int i=Head[q]; i!=-1; i=enode[i].next )
		{
			int e = enode[i].to;
			if ( dist[q] + enode[i].cost < dist[e] ) 
			{
				dist[e] = dist[q] + enode[i].cost;
				if ( !inQueue[e] )
				{
					inQueue[e] = 1;
					Q.push( e );
				}
			}
		}
	}
}

long long getTotal( int n )
{
	long long ret = 0;
	for (int i=2; i<=n; i++)
		ret += dist[i];
	return ret;
}

int main( )
{
	//cout << (int)(1<<30) << endl;
	int T;
	cin >> T;
	
	while( T-- )
	{
		int n, m;
		scanf("%d%d", &n, &m);

		memset( OriginHead, -1, sizeof(OriginHead) );
		memset( RevHead, -1, sizeof(RevHead) );
		NE = 0;
		for (int i=0; i 
 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇poj3519 Lucky Coins Sequence矩.. 下一篇POJ 2418 ,ZOJ 1899 Hardwood Sp..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Linux 系统监控 的完 (2025-12-27 08:52:29)
·一口气总结,25 个 L (2025-12-27 08:52:27)
·【总结】100个最常用 (2025-12-27 08:52:22)
·有没有哪些高效的c++ (2025-12-27 08:20:57)
·Socket 编程时 Accep (2025-12-27 08:20:54)