您的位置:首页 > 其它

poj 3159 Candies

2012-05-21 19:21 239 查看
http://poj.org/problem?id=3159

经过我不断的尝试 老天重要显灵了

终于来个个 1400+ms 伤不起呀

用 queue 过不了 得用 stack

可能对于后台数据 queue 会有一些多余的搜索

也可能时 stack 本身比 queue 用快一些

anyway 我的代码就得用 stack

还有就是题目描述有点问题

它是让我们求 flymouse 最多比 snoopy 多得多少 candy

#include<iostream>
#include<cstdio>
#include<string>
#include<queue>
#include<stack>
#include<cstring>

using namespace std;

const int N=30005;
stack<int>str;//需要用 stack 不能用 queue
struct node
{
struct tt *next;
}mem
;//需要用邻接表
int dis
;
bool in
;
struct tt
{
struct tt *next;
int j;
int x;
};
inline void build(int i,int j,int x)
{
struct tt *t=new tt;
t->j=j;
t->x=x;
t->next=mem[i].next;
mem[i].next=t;
}
int n;
void findans()
{
memset(dis,-1,sizeof(dis));//距离
memset(in,false,sizeof(in));//是否在栈 中
dis[1]=0;
in[1]=true;
str.push(1);//1 入栈
int k;
struct tt *t;
while(!str.empty())
{
k=str.top();
str.pop();
in[k]=false;
t=mem[k].next;
while(t!=NULL)
{
if(dis[t->j]>dis[k]+t->x||dis[t->j]==-1)//无论 t->j 在不在栈中 可更新时就更新
{
dis[t->j]=dis[k]+t->x;
if(!in[t->j]&&t->j!=n)//但只有 不在栈中时 才 入栈 防止重复搜索
{str.push(t->j);in[t->j]=true;}
}
t=t->next;
}
}
}
int main()
{
int m,i,j,x;
scanf("%d %d",&n,&m);
while(m--)
{
scanf("%d %d %d",&i,&j,&x);
if(i!=n&&j!=1)//剪掉无意义的边
build(i,j,x);
};
findans();
printf("%d\n",dis
);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: