poj 1860 Currency Exchange (SPFA、正权回路 bellman-ford)

链接:poj 1860

题意:给定n中货币。以及它们之间的税率。A货币转化为B货币的公式为 B=(V-Cab)*Rab,当中V为A的货币量,

求货币S通过若干此转换,再转换为原本的货币时是否会添加

分析:这个题就是推断是否存在正权回路。能够用bellman-ford算法,只是松弛条件相反

也能够用SPFA算法,推断经过转换后,转换为原本货币的值是否比原值大、、、

bellman-ford    0MS

#include<stdio.h>
#include<string.h>
struct stu
{
int a,b;
double r,c;
}edge[205];
double v,dis[105];
int s;
int bellmanford(int n,int m)
{
int i,j,flag=0;
memset(dis,0,sizeof(dis));
dis[s]=v;
for(i=1;i<=n-1;i++)
for(j=1;j<=m;j++)
if(dis[edge[j].a]&&(dis[edge[j].a]-edge[j].c)*edge[j].r>dis[edge[j].b])
dis[edge[j].b]=(dis[edge[j].a]-edge[j].c)*edge[j].r;
for(j=1;j<=m;j++)
if(dis[edge[j].a]&&(dis[edge[j].a]-edge[j].c)*edge[j].r>dis[edge[j].b]){
flag=1;
break;
}
return flag;
}
int main()
{
int i,j,l,r,n,m,flag;
while(scanf("%d%d%d%lf",&n,&m,&s,&v)!=EOF){
j=1;
for(i=1;i<=m;i++){
scanf("%d%d",&l,&r);
scanf("%lf%lf",&edge[j].r,&edge[j].c);
edge[j].a=l;
edge[j].b=r;
j++;
edge[j].a=r;
edge[j].b=l;
scanf("%lf%lf",&edge[j].r,&edge[j].c);
j++;
}
flag=bellmanford(n,2*m);
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}

SPFA+邻接表  16MS

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct stu
{
int a,b;
double r,c;
}edge[205];
double v,dis[105];
int s,first[205],next[205],vis[105];
int SPFA(int n,int m)
{
int i,pos;
queue<int> q;
memset(dis,0,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[s]=v;
q.push(s);
vis[s]=1;
while(!q.empty()){
pos=q.front();
q.pop();
vis[pos]=0;
i=first[pos];
while(i!=-1){
if((dis[pos]-edge[i].c)*edge[i].r>dis[edge[i].b]){
dis[edge[i].b]=(dis[pos]-edge[i].c)*edge[i].r;
if(!vis[edge[i].b]){
q.push(edge[i].b);
vis[edge[i].b]=1;
}
}
i=next[i];
}
if(dis[s]>v)
return 1;
}
return 0;
}
int main()
{
int i,j,l,r,n,m,flag;
while(scanf("%d%d%d%lf",&n,&m,&s,&v)!=EOF){
j=1;
for(i=1;i<=m;i++){
scanf("%d%d",&l,&r);
scanf("%lf%lf",&edge[j].r,&edge[j].c);
edge[j].a=l;
edge[j].b=r;
j++;
edge[j].a=r;
edge[j].b=l;
scanf("%lf%lf",&edge[j].r,&edge[j].c);
j++;
}
memset(first,-1,sizeof(first));
for(i=1;i<=2*m;i++){
next[i]=first[edge[i].a];
first[edge[i].a]=i;
}
flag=SPFA(n,2*m);
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
上一篇:matlab 解方程组


下一篇:trie树模型