您的位置:首页 > 其它

POJ 3159 Candies

2011-01-29 23:17 411 查看
典型差分约束,求最大值,按照最短路构图

根据题意,Sb-Sa<=c,于是a向b连一条权为c的边

这题似乎是卡队列的,我一开始写的普通的spfa+队列,WA了,想了下,可能是队列大小不够,于是开到30000×100,还是WA,再开到30000*500,变成TLE了

后来又换成循环队列,还是TLE,于是看了DISCUSS用spfa+栈,500MS,又学了一招

代码:

#include<iostream>
using namespace std;
const int MAX=30005;
const int inf=1<<30;
struct node
{
int v,w,next;
}g[MAX*10];
int dis[MAX],adj[MAX],s[MAX],vis[MAX];
int n,m,e;
void add(int u,int v,int c)
{
g[e].v=v; g[e].w=c; g[e].next=adj[u]; adj[u]=e++;
}
void spfa()
{
int top=0,i,u,v;
for(i=1;i<=n;i++)
dis[i]=inf;
dis[1]=0;
memset(vis,0,sizeof(vis));
s[++top]=1;
vis[1]=1;
while(top)
{
u=s[top--];
//cout<<u<<endl;
vis[u]=0;
for(i=adj[u];i!=-1;i=g[i].next)
{
v=g[i].v;
if(dis[v]>dis[u]+g[i].w)
{
dis[v]=dis[u]+g[i].w;
if(!vis[v])
{
s[++top]=v;
vis[v]=1;
}
}
}
}
}
int main()
{
int a,b,c;
memset(adj,-1,sizeof(adj));
e=0;
scanf("%d%d",&n,&m);
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
}
spfa();
cout<<dis
<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: