匈牙利游戏之A*版

来源:互联网 发布:房屋设计图平面图软件 编辑:程序博客网 时间:2024/06/06 19:31

题目>>http://codevs.cn/problem/1269/

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<queue>using namespace std;const int MAXN = 8e5 + 5;const int INF = 1e7;struct zz{    int num,ds,de;    bool operator < (zz a) const    {        return (a.de + a.ds) < de + ds;    }}num[50005];queue<int>q;priority_queue<zz>p;struct zt{    int f,t,v;}road[MAXN];struct zg{    int f,t,v;}road2[MAXN];int l = 1e6;int m,n,k,s,e,a,b,c,ans,firs[50005],nex[MAXN],cnt = 0,used[50005],ji = 0,lu = -1,cnt2 = 0,firs2[50005],nex2[MAXN];void build(int f,int t,int v){    road[++cnt] = (zt){f,t,v};    nex[cnt] = firs[f];    firs[f] = cnt;}void build2(int f,int t,int v){    road2[++cnt2] = (zg){f,t,v};    nex2[cnt2] = firs2[f];    firs2[f] = cnt2;}void spfa(int x){    while(!q.empty())        q.pop();    for(int i = 1;i <= n;i ++)        num[i].de = INF;    num[x].de = 0;    memset(used,0,sizeof(used));    q.push(x);    while(!q.empty())    {        int u = q.front();        q.pop();        used[u] = 0;        for(int i = firs[u];i != -1;i = nex[i])        {            int t = road[i].t;            if(num[t].de > num[u].de + road[i].v)            {                num[t].de = num[u].de + road[i].v;                if(!used[t])                    q.push(t);                used[t] = 1;            }        }    }}void dijk(int x){    while(!p.empty())        p.pop();    num[x].ds = 0;    for(int i = 1;i <= n;i ++)        num[i].num = i;    p.push(num[x]);    l --;    while(!p.empty())    {        zz u = p.top();        p.pop();        if(ans)            break;        if(u.num == e&&lu != u.ds)            ji ++,lu = u.ds;        if(ji == k)            ans = u.ds;        for(int i = firs2[u.num];i != -1;i = nex2[i])        {            int t = road2[i].t;            if(l)                 p.push((zz){t,u.ds + road2[i].v,num[t].de}),l --;        }    }}int main(){    scanf("%d%d",&n,&m);    memset(firs,-1,sizeof(firs));    memset(firs2,-1,sizeof(firs2));    for(int i = 1; i<= m;i ++)    {        scanf("%d%d%d",&a,&b,&c);        build(b,a,c);        build2(a,b,c);    } //  scanf("%d%d%d",&s,&e,&k);    s = 1;e = n;k = 2;    spfa(e);    dijk(s);    if(ans)        printf("%d",ans);    else        puts("-1");}
原创粉丝点击