POJ 2607 SPFA

求出所有FireStation到其它的Intersection的距离,再求出基它Intersection到其它点的距离,然后比较距离就OK了

用SPFA +AdjacencyList 的速度较快 用Dijkstra会超时


题目测试数据:http://plg1.cs.uwaterloo.ca/~acm00/990925.data/






#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAXN 510
struct node
{
	int v;
	int w;
	node* next;
};
inline void AdjacencyList(int u,int v,int w,node edge[])
{
	node* NewNode = new node;
	NewNode -> v = v;
	NewNode -> w = w;
	NewNode -> next = edge[u].next;
	edge[u].next = NewNode;
}
int qu[MAXN * 4];
void spfa(int start,int d[],node edge[])
{
	bool visit[MAXN];
	memset(visit,false,sizeof(visit));
	qu[0] = start;
	d[start] = 0;
	visit[start] = true;
	int head = 0;
	int tail = 1;
	while(head < tail)//queue.empty
	{
	/*	cout<<"qu"<<endl;
		for(int i = head; i < tail; i++)
		{
			cout<<qu[i]<<" ";
		}*/
	//	cout<<endl;
		int u = qu[head++];
		visit[u] = false;//不在队列
		node* ptr = edge[u].next;
		while(ptr)
		{
			if(d[ptr -> v] >  d[u] + ptr -> w)
			{
				d[ptr -> v] = d[u] + ptr -> w;
				if(visit[ptr -> v] == false)
				{
					qu[tail++] = ptr -> v;//成功松驰加入队列
					visit[ptr -> v] = true;//在队列里面
				}
			}
			ptr = ptr -> next;
		}
	}
	/*cout<<"d"<<endl;
	for(int i = 1; i <= SumInter; i++)
	{
		cout<<d[i]<<" ";
	}
	cout<<endl;*/
}
int main()
{
	int SumFire,SumInter;
	int fire[MAXN];
	//freopen("A.3.dat","r",stdin);
	while(scanf("%d %d",&SumFire,&SumInter) != EOF)
	{
		
		int i;
		int d[MAXN];
		memset(d,127,sizeof(d));
		node edge[MAXN];
		for(i = 0; i <= SumInter; i++)
		{
			edge[i].next = NULL;
		}
		for(i = 0; i < SumFire; i++)
		{
			scanf("%d",&fire[i]);
		}
		int from,to,w;
		while(scanf("%d %d %d",&from,&to,&w) != EOF)
		{
			AdjacencyList(from,to,w,edge);
			AdjacencyList(to,from,w,edge);
		}
		for(i = 0; i < SumFire; i++)
		{
			spfa(fire[i],d,edge);
		}
		int dis[MAXN];
		int ans;
		memset(&ans,127,sizeof(ans));
		int flag;
		flag = 1;
		for(i = 1; i <= SumInter; i++)
		{
			if(d[i] == 0)
			{
				continue;
			}
			memcpy(dis,d,sizeof(dis));
			spfa(i,dis,edge);
			int MaxEdge = 0;
			int j;
			for(j = 1; j <= SumInter; j++)
			{
				if(dis[j] > MaxEdge)
				{
					MaxEdge = dis[j];
				//cout<<"MaxEdge"<<MaxEdge<<endl;
				}
			}
			if(MaxEdge < ans)
			{
				ans = MaxEdge;
				flag = i;
			}
		}
		printf("%d\n",flag);
		
	}
	return 0;
}


### 关于 POJ 2092 的问题分析 POJ 平台上的题目通常涉及算法设计与实现,而编号为 2092 的具体题目并未在提供的引用中明确提及。然而,可以通过已知的相关资源和经验推测其可能的解决方法。 #### 差分约束系统的应用 如果假设 POJ 2092 类似于其他差分约束类问题,则可以参考类似的解决方案[^3]。这类问题的核心在于通过构建不等式组来表示变量之间的关系,并将其转化为图论中的最短路径或最长路径问题。例如: - 对于条件 \( P \),\( A - B = X \) 可以被分解为两个不等式: \( A - B \geq X \) 和 \( A - B \leq X \)[^3]。 - 对于条件 \( V \),则有 \( A - B \geq 1 \)。 这些不等式可以用边的形式表示在一个加权图中,随后运行 SPFA 或 Bellman-Ford 算法检测是否存在满足所有约束的解集。特别需要注意的是引入一个超级源点连接到所有节点,从而保证整个图连通性。 #### 动态规划 vs 常规方法对比 针对某些特定类型的优化问题,动态规划 (Dynamic Programming, DP) 方法能够显著提高效率并减少冗余计算量。相比之下,传统方式可能会因为重复子问题而导致性能瓶颈。尽管当前讨论未直接指向 POJ 2092 是否适用此技术路线,但从更广泛意义上看,DP 是处理复杂状态转移的有效工具之一[^2]。 以下是基于上述理论框架的一个简单 Python 实现例子用于验证可行性: ```python from collections import deque def spfa(n, edges): INF = float('inf') dist = [-INF] * n in_queue = [False] * n q = deque() s = 0 # Super source node index. # Initialize distances from super-source to all nodes as zero. for i in range(n): if not in_queue[i]: q.append(i) in_queue[i] = True while q: u = q.popleft() in_queue[u] = False for v, w in edges.get(u, []): if dist[v] < dist[u] + w: dist[v] = dist[u] + w if not in_queue[v]: q.append(v) in_queue[v] = True return any(dist[i] >= INF / 2 for i in range(1,n)) # Example usage with dummy data representing constraints... if __name__ == "__main__": N = 5 # Number of variables plus one extra 'super' start point. E = {0:[(i,0)for i in range(1,N)]} # Connects every variable directly via weight-zero links. result = spfa(N,E) print("Positive cycle exists:",result) ``` 以上代码片段展示了如何运用队列辅助广度优先搜索(SPFA)寻找潜在正向循环逻辑链路结构。这一步骤对于判定是否有可行方案至关重要。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值