图论专项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;}
- 图论专项shortest_paths:UVa 658
- 图论专项shortest_paths:UVa 10246
- 图论专项shortest_paths:UVa 11280
- 图论专项shortest_paths:UVa 10269
- 字符串专项:UVa 12012
- 搜索专项:UVa 10318
- 字符串专项:UVa 10298
- 字符串专项:UVa 11475
- 字符串专项:UVa 11855
- 图论专项训练习题集
- 图论专项练习反思
- 数学专项counting:UVa 11038
- 数学专项counting:UVa 10883
- 计算几何专项:UVa 11437
- 计算几何专项:UVa 11646
- 计算几何专项:UVa 11817
- 计算几何专项:UVa 11524
- 计算几何专项:UVa 10566
- 什么是MySQL视图
- adapter
- Linux的锁和条件变量用法 | pthread_mutex_lock | pthread_cond_signal
- wifi漫游测试过程
- JAVA基础--JAVA中的反射机制详解
- 图论专项shortest_paths:UVa 658
- 思科电子书大放送了~~
- virtaulbox 视图模式常用切换
- 如何对MySQL数据表进行复制、表结构复制
- 8.16大盘异动,2分钟A股大涨5%,午后立即下跌,狠狠打了追涨的人一巴掌
- 10个调试和排错的小建议
- shape边框使用,EditText不获取焦点
- struts2流程和源码分析
- Android SDK Manager 下载SDK失败的解决办法