题目链接:http://poj.org/problem?id=3159
题目意思:flymouse是班里的班长,她(假设是女的哈)从老师那里拿来了一袋糖果,要发给班里的同学。好吧,flymouse与snoopy平时在班里是死对头,这下子,他(假设是男的啦)是要倒霉了。由于班里的同学都喜欢吃糖,但是每个同学都要说出一个条件,那就是A认为B同学的糖不能比他的多C,flymouse在发糖的时候要满足所有同学的要求,现在问,flymouse如何给每个同学发糖,最后能使自己的糖的数量比snoopy多的最多,输出这个数量,假设同学的编号为1-n,其中snoopy为1号,flymouse为n号!
看了题目的discuss,大家都在议论用spfa+队列实现的话,会造成超时的。好吧,开始的时候我用链表实现邻接表,然后用spfa+栈进行,交上去,结果还是超时,到网上查了查,使用数组模拟生成邻接表,然后再提交,AC了,500+ms。(疑惑:链表实现为何会超时呢,有知道的朋友,谢谢答惑)
代码:
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define INF 100000000
typedef struct EdgeNode{
int v;
int w;
}EdgeNode;
EdgeNode edge[150005];
int node[30005],next[150005];
int dis[30005],inS[30005];
int S[30005],top;
int n,m;
void spfa()
{
int i,x;
int r;
top=0;
memset(inS,0,sizeof(inS));
for(i=1;i<=n;i++)
dis[i]=INF;
dis[1]=0;
S[++top]=1;
inS[1]=1;
while(top)
{
x=S[top];
top--;
inS[x]=0;
for(r=node[x];r!=-1;r=next[r])
{
if(dis[edge[r].v]>dis[x]+edge[r].w)
{
dis[edge[r].v]=dis[x]+edge[r].w;
if(!inS[edge[r].v])
{
S[++top]=edge[r].v;
inS[edge[r].v]=1;
}
}
}
}
}
void main()
{
int i=1;
int a,b,c;
scanf("%d%d",&n,&m);
memset(node,-1,sizeof(node));
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
edge[i].v=b;
edge[i].w=c;
next[i]=node[a];
node[a]=i++;
}
spfa();
printf("%d\n",dis[n]);
}