您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: