程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> poj 3031 Big Christmas Tree(水spfa)

poj 3031 Big Christmas Tree(水spfa)

編輯:C++入門知識

 

題意:

Because of a technical difficulty, price of an edge will be (sum of weights of all descendant nodes) × (unit price of the edge).這句話一直沒看懂。後面還以為是最小生成樹。

 

正確題意是:給一個無向圖,計算每個點到1節點的最短路徑(dis[i]) * 每個節點的weights之和。

注意:邊權值等要用__int64;無向圖;

 

 

#include 
#include 
#include 
#include 
#include
#include 
#include 
#include 
#include 
#include 
#define LL long long
#define _LL __int64
using namespace std;
const _LL INF = 1e18;
const int maxn = 50010;
const int maxm = 50010;


struct node
{
	int v;
	_LL w;
	int next;
}edge[2*maxm];

int cnt,head[maxn];
_LL W[maxn];
int n,m;
_LL ans,dis[maxn];

void init()
{
	cnt = 0;
	memset(head,-1,sizeof(head));
}

void add(int u, int v, _LL w)
{
	edge[cnt] = (struct node){v,w,head[u]};
	head[u] = cnt++;
}

void solve()
{
	int inque[maxn];
	queue  que;
	while(!que.empty()) que.pop();
	memset(inque,0,sizeof(inque));
	for(int i = 1; i <= n; i++)
		dis[i] = INF;
	dis[1] = 0;
	inque[1] = 1;
	que.push(1);

	while(!que.empty())
	{
		int u = que.front();
		que.pop();
		inque[u] = 0;

		for(int i = head[u]; i != -1; i = edge[i].next)
		{
			int v = edge[i].v;
			_LL w = edge[i].w;
			if(dis[v] > dis[u] + w)
			{
				dis[v] = dis[u] + w;
				if(!inque[v])
				{
					inque[v] = 1;
					que.push(v);
				}
			}
		}
	}
}

int main()
{
	int test;
	int u,v;
	_LL w;
	scanf(%d,&test);
	while(test--)
	{
		init();
		scanf(%d %d,&n,&m);
		for(int i = 1; i <= n; i++)
			scanf(%I64d,&W[i]);
		for(int i = 1; i <= m; i++)
		{
			scanf(%d %d %I64d,&u,&v,&w);
			add(u,v,w);
			add(v,u,w);
		}
		solve();
		ans = 0;
		bool flag = true;

		for(int i = 2; i <= n; i++)
		{
			if(dis[i] == INF)
			{
				flag = false;
				break;
			}
			ans += dis[i] * W[i];
		}
		if(flag == false)
			printf(No Answer
);
		else printf(%I64d
,ans);
	}
	return 0;
}


 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved