poj 3159 Candies------spfa算法
2013-07-06 17:08
337 查看
数据结构中对于稀疏图的定义为:有很少条边或弧(如e<nlogn,n是图的顶点数,e是弧数)的图称为稀疏图(sparse graph),反之成为稠密图(dense graph)。
这题是稠密图,所以spfa算法要用stack,,,如果是稀疏图 ,则用queue。
静态邻接表+spfa。
这题是稠密图,所以spfa算法要用stack,,,如果是稀疏图 ,则用queue。
静态邻接表+spfa。
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> #include<iostream> #include<math.h> #include<stack> #define INF 30010 using namespace std; struct node{ int a,b,len; }p[150050]; int n; int nex[150050]; //nex[i]数组 应该开 边的范围,刚开始开的nex[INF],开小了 int first[INF],f[INF],dis[INF]; void spfa() { int i,j,k; stack<int> q; for(i=0;i<=n;i++){ dis[i]=1000000000; f[i]=0; } dis[1]=0; f[1]=1; q.push(1); while(!q.empty()){ int t=q.top(); q.pop(); for(i=first[t];i!=-1;i=nex[i]){ if(dis[t]+p[i].len < dis[p[i].b]){ dis[p[i].b] = dis[t]+p[i].len; if(f[p[i].b]==0){ q.push(p[i].b); f[p[i].b]=1; } } } f[t]=0; } } int main() { int m,i,j,k; scanf("%d%d",&n,&m); memset(first,-1,sizeof(first)); for(i=1;i<=m;i++) { int t1,t2,t3; scanf("%d%d%d",&t1,&t2,&t3); p[i].a=t1; p[i].b=t2; p[i].len=t3; nex[i]=first[p[i].a]; first[p[i].a]=i; } spfa(); printf("%d\n",dis ); }
相关文章推荐
- POJ 3159 Candies(差分约束)
- poj 3159 Candies
- POJ 3159 Candies (差分约束)
- poj 3159 Candies
- POJ 3159 Candies (差分约束 Dijkstra+优先队列 SPFA+栈)
- poj 3159 candies (差分约束 spfa+stack)
- POJ 3159 Candies (差分约束#1)
- POJ 3159 Candies(SPFA+stack)
- POJ 3159-Candies(差分约束系统-SPFA+邻接表)
- POJ 3159 Candies 差分约束 spfa+栈+邻接表
- POJ 3159 Candies
- poj_3159_Candies
- POJ 3159 Candies、
- poj 3159 Candies
- POJ 3159 Candies 差分约束系统
- poj3159 Candies 2012-09-07
- POJ 3159 Candies (差分约束 Dijkstra+优先队列 SPFA+栈)
- poj 3159 Candies
- POJ-3159 Candies(差分约束)
- poj 3159 -- Candies ( spfa + 栈 )