图论专项shortest_paths:UVa 658

来源:互联网 发布:美工接单平台 编辑:程序博客网 时间:2024/06/05 14:41

bug的每个状态为一个点,以pitch为边建图跑最短路即可,只不过这题点数很大,差不多一百万个点,所以SPFA有点慢,我跑了2.2s才过……

#include <iostream>#include <cstdio>#include <queue>#include <cstring>using namespace std;const int maxn=30;const int maxm=110;const int inf=1<<30;int n,m;char b[maxm][maxn],p[maxm][maxn];int cost[maxm];int d[1<<20],vis[1<<20];int judge(int x,int st){    for(int i=0;i<n;i++)    {        if(b[x][i]=='+' && (st&(1<<i))==0) return 0;        if(b[x][i]=='-' && (st&(1<<i))) return 0;    }    return 1;}int trans(int x,int st){    for(int i=0;i<n;i++)    {        if(p[x][i]=='+') st|=(1<<i);        if(p[x][i]=='-' && (st&(1<<i)))            st^=(1<<i);    }    return st;}void bellmanford(){    queue<int> q;    for(int i=0;i<(1<<n);i++) d[i]=inf,vis[i]=0;    q.push((1<<n)-1);    d[(1<<n)-1]=0;vis[(1<<n)-1]=1;    while(!q.empty())    {        int u=q.front();q.pop();vis[u]=0;        for(int i=0;i<m;i++) if(judge(i,u))        {            int v=trans(i,u);            if(d[v]>d[u]+cost[i])            {                d[v]=d[u]+cost[i];                if(!vis[v])                {                    vis[v]=1;                    q.push(v);                }            }        }    }}int main(){    int kase=1;    while(~scanf("%d%d",&n,&m))    {        if(!n && !m) break;        for(int i=0;i<m;i++)            scanf("%d%s%s",&cost[i],b[i],p[i]);        bellmanford();        printf("Product %d\n",kase++);        if(d[0]==inf) puts("Bugs cannot be fixed.");        else printf("Fastest sequence takes %d seconds.\n",d[0]);        puts("");    }    return 0;}


原创粉丝点击