vijosP1754 最优贸易

来源:互联网 发布:nginx虚拟主机是什么 编辑:程序博客网 时间:2024/04/29 08:23
  双向bfs第一次求最短路,第二次求最长路,两次的值取差。
#include <cstring>#include <algorithm>#include <cstdio>#include <cmath>#include <vector>#include <queue>#include <iostream>using namespace std;#define maxn 110000#define pb(a) push_back(a);int getint(){    int res=0;    char c;    while(c=getchar(),c<'0'||c>'9');        res=c-'0';    while(c=getchar(),c>='0'&&c<='9')        res=res*10+c-'0';    return res;}int n,m,pric[maxn],vis[maxn],val1[maxn],val2[maxn];vector<int>g1[maxn],g2[maxn];void bfs1(){    queue<int>q;    memset(vis,0,sizeof(vis));    val1[1]=pric[1];    vis[1]=1;    q.push(1);    int now,next;    while(!q.empty())    {        now=q.front();        q.pop();        vis[now]=0;        for(int i=0;i<g1[now].size();i++)        {            next=g1[now][i];            if(val1[next]>min(val1[now],pric[next]))            {                val1[next]=min(val1[now],pric[next]);                if(!vis[next])                {                    vis[next]=1;                    q.push(next);                }            }        }    }}void bfs2(){    queue<int>q;    memset(vis,0,sizeof(vis));    val2[n]=pric[n];    vis[n]=1;    q.push(n);    int now,next,tot;    while(!q.empty())    {        now=q.front();        q.pop();        vis[now]=0;        for(int i=0;i<g2[now].size();i++)        {            next=g2[now][i];            if(val2[next]<max(val2[now],pric[next]))            {                val2[next]=max(val2[now],pric[next]);                if(!vis[next])                {                    vis[next]=1;                    q.push(next);                }            }        }    }}int main(){    scanf("%d%d",&n,&m);    rep(i,1,n)    {        pric[i]=getint();    }    int a,b,c;    rep(i,1,m)    {        a=getint();        b=getint();        c=getint();        if(c==1)        {             g1[a].pb(b);             g2[b].pb(a);        }        else        {             g1[a].pb(b);             g1[b].pb(a);             g2[a].pb(b);             g2[b].pb(a);        }    }    memset(val2,0,sizeof(val2));    memset(val1,0x3f3f3f3f,sizeof(val1));    bfs1();    bfs2();    int ans=0;    for(int i=1;i<=n;i++)    {        ans=max(ans,val2[i]-val1[i]);    }    printf("%d",ans);    return 0;}

0 0
原创粉丝点击