POJ 1860 Currency Exchange
2015-09-07 21:50
218 查看
/*题意:求图中是否存在正权回路,有YES,没有NO*/ #include<stdio.h> #include<string.h> #include<queue> #include<iostream> #include<algorithm> using namespace std; const int maxn=1e3+10; const int maxm=maxn<<1; int next[maxm],head[maxm],cnt[maxm],vis[maxm]; double dist[maxm]; int n,m,s; double V; queue<int>q; struct node { int u,v; double r,c; }t[maxm]; int spfa()//几乎是模板 { dist[s]=V;//起点的钱 vis[s]=1;//表示以后不用再计算起点 q.push(s); while(!q.empty()) { int k=q.front(); q.pop(); vis[k]=0; for(int i=head[k];i!=-1;i=next[i]) { if(dist[t[i].v]<(dist[k]-t[i].c)*t[i].r)//如果转换后钱还要多些,那么就完全可以换 { dist[t[i].v]=(dist[k]-t[i].c)*t[i].r; if(!vis[t[i].v]) { if(++cnt[t[i].v]==n) return 1; q.push(t[i].v); vis[t[i].v]=1; } } } if(dist[s]>V) { return 1; } } return 0; } int main() { while(scanf("%d%d%d%lf",&n,&m,&s,&V)!=EOF) { s--; memset(vis,0,sizeof(vis));//初始化 memset(head,-1,sizeof(head)); memset(cnt,0,sizeof(cnt)); memset(dist,0,sizeof(dist)); int u,v; double r1,c1,r2,c2; for(int i=0;i<m;i++) { scanf("%d%d%lf%lf%lf%lf",&u,&v,&r1,&c1,&r2,&c2); u--; v--; //这里有两条边,而不是一条边 t[i<<1].u=t[i<<1|1].v=u;//用位运算更节约时间 t[i<<1].v=t[i<<1|1].u=v; t[i<<1].r=r1; t[i<<1].c=c1; t[i<<1|1].r=r2; t[i<<1|1].c=c2; next[i<<1]=head[u]; head[u]=i<<1; next[i<<1|1]=head[v]; head[v]=i<<1|1; } if(spfa()) { printf("YES\n"); } else { printf("NO\n"); } } return 0; }
相关文章推荐
- HDU - 4035(概率dp 用待定系数法解决递推依赖)
- 2010 Asia Regional Tianjin Site —— Online Contest (线段树二维转一维,2-SAT,floyed变形)hdu3621-3631
- c++之模板
- Mifare系列7-安全性(转)
- linux或mac系统下的端口转发
- Servlet的异常处理机制
- UVa 12275 Sensor network 生成树
- 高效程序员的狂暴之路
- Java 创建对象有哪几种方式
- SQLite Android数据库详解
- Mifare系列6-射频卡与读写器的通信(转)
- 搭建go开发环境时,出现GoSublime error: MarGo build failed的问题
- 黑马程序员--动态类型检测
- 【五校联考2015 9.5】送你一棵线段树
- Android 之数据存储--SharedPreferences
- Android数据存储
- 英文语句处理(空格处理)
- 关于synchronized关键字的一点补充
- win7配置sql server 2005数据库服务器
- 面试之简答题