POJ 3159(spfa + 数组模拟)

来源:互联网 发布:为什么微信网络不稳定 编辑:程序博客网 时间:2024/06/05 22:50

题意:n个人分糖果,问题是怎么分才能使第一个人和最后一个人相差最多。条件限制是有m个第a不能低于第b人c个。


于是a+c >= b,则可以得到b < a + c.在图中可以认为a->b的权值是c。如果dis[a]+c < dis[b],就松弛。

题中数据过多。则用spfa,并且需要数组模拟queue。

#include<cstdio>#include<iostream>#include<cstring>#define inf 0x3f3f3f3f#define maxn 30005using namespace std;class Node{public:    int e,v;    int next;}edge[150005];int n,m;int head[maxn];int dis[maxn];int visit[maxn];int Q[maxn];int pos = 0;void spfa(){    pos = 0;    memset(dis,inf,sizeof(dis));    memset(visit,0,sizeof(visit));    Q[pos++] = 1;    visit[1] = true;    dis[1] = 0;    while(pos != 0){        int u = Q[--pos];        visit[u] = false;        for(int i = head[u];i != -1; i = edge[i].next){            int to = edge[i].e;            if(dis[to] < dis[u] + edge[i].v)                continue;            dis[to] = dis[u] + edge[i].v;            if(!visit[to]){                Q[pos++] = to;                visit[to] = true;            }        }    }}int main(){//    freopen("in.txt","r",stdin);    scanf("%d%d",&n,&m);    memset(head,-1,sizeof(head));    int a,b,c;    for(int i = 1;i <= m; i++){        scanf("%d%d%d",&a,&b,&c);        edge[i].e = b;        edge[i].v = c;        edge[i].next = head[a];        head[a] = i;    }    spfa();    printf("%d\n",dis[n]);    return 0;}


0 0