设为首页 收藏本站
查看: 1329|回复: 0

[经验分享] POJ 1860 Currency Exchange + 2240 Arbitrage + 3259 Wormholes 解题报告

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-9-11 11:17:04 | 显示全部楼层 |阅读模式
  三道题都是考察最短路算法的判环。其中1860和2240判断正环,3259判断负环。
  难度都不大,可以使用Bellman-ford算法,或者SPFA算法。也有用弗洛伊德算法的,笔者还不会SF-_-……
  直接贴代码。
  1860 Currency Exchange:



#include <cstdio>
#include <cstring>
int N,M,S;
double V;
const int maxn=101;
int first[maxn],vv[maxn*maxn],nxt[maxn*maxn];
double ww[maxn*maxn],cc[maxn*maxn];
double d[maxn];
int count[maxn];
int stack[maxn];
bool vis[maxn];
bool SPFA()
{
for(int i=1;i<=N;i++)
vis=count=d=0;
int top=0;
stack[++top]=S;
d[S]=V;
vis[S]=true;
count[S]++;
while(top)
{
int a=stack[top--];
vis[a]=false;
for(int e=first[a];e;e=nxt[e])
{
if(d[vv[e]]<(d[a]-cc[e])*ww[e])
{
d[vv[e]]=(d[a]-cc[e])*ww[e];
if(!vis[vv[e]])
{
stack[++top]=vv[e];
count[vv[e]]++;
if(count[vv[e]]>=N)
return false;
vis[vv[e]]=true;
}
}
}
}
return true;
}
int main()
{
//  freopen("in.txt","r",stdin);
int e=2;
scanf("%d%d%d%lf",&N,&M,&S,&V);
for(int i=1;i<=M;i++)
{
int u,v;
double w1,c1,w2,c2;
scanf("%d%d%lf%lf%lf%lf",&u,&v,&w1,&c1,&w2,&c2);
nxt[e]=first,vv[e]=v,ww[e]=w1,cc[e]=c1,first=e++;
nxt[e]=first[v],vv[e]=u,ww[e]=w2,cc[e]=c2,first[v]=e++;
}
printf(SPFA()?"NO\n":"YES\n");
}
  2240 Arbitrage:  起点不确定,需要枚举。map方便一点,hash……应该快一点



#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#include <map>
#include <string>
const int maxn=31;
map<string,int> mp;
int first[maxn],vv[maxn*maxn],nxt[maxn*maxn];
double ww[maxn*maxn];
int stack[maxn];
double d[maxn];
int count[maxn];
bool vis[maxn];
int n;
int SPFA(int sta)
{
int top=0;
stack[++top]=sta;
memset(vis,0,sizeof(vis));
memset(d,0,sizeof(d));
memset(count,0,sizeof(count));
count[sta]++;
d[sta]=1;
while(top)
{
int a=stack[top--];
vis[a]=false;
for(int e=first[a];e;e=nxt[e]) if(d[vv[e]]<d[a]*ww[e])
{
d[vv[e]]=d[a]*ww[e];
if(!vis[vv[e]])
{
stack[++top]=vv[e];
count[vv[e]]++;
if(count[vv[e]]>=n)
return false;
vis[vv[e]]=true;
}
}
}
return true;
}
int main()
{
//  freopen("in.txt","r",stdin);
int cas=1;
string str,str2;
while(scanf("%d",&n) && n)
{
mp.clear();
for(int i=1;i<=n;i++)
{
cin>>str;
mp[str]=i;
}
memset(first,0,sizeof(first));
int e=2;
int m;
scanf("%d",&m);
while(m--)
{
cin>>str>>ww[e]>>str2;
int u=mp[str];
int v=mp[str2];
nxt[e]=first,vv[e]=v,first=e++;
}
bool flag=false;
for(int i=1;i<=n;i++) if(!SPFA(i))
flag=true;
printf("Case %d: ",cas++);
printf(flag?"Yes\n":"No\n");
}
}
  3259 Wormholes:



#include <cstdio>
#include <cstring>
int first[501],vv[6000],ww[6000],nxt[6000];
int d[501];
bool relax(int u,int v,int w)
{
if(d[v]<=d+w) return false;
d[v]=d+w;
return true;
}
bool bellman_ford(int n)
{
memset(d,0,sizeof(d));
bool flag;
for(int i=1;i<=n;i++)
{
flag=true;
for(int u=1;u<=n;u++)
for(int e=first;e;e=nxt[e])
if(relax(u,vv[e],ww[e]))
flag=false;
if(flag)
return true;
else if(i==n)
return false;
}
return true;
}
int main()
{
//  freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
int N,M,W;
scanf("%d%d%d",&N,&M,&W);
int e=2;
int u,v,w;
memset(first,0,sizeof(first));
for(int i=0;i<M;i++)
{
scanf("%d%d%d",&u,&v,&w);
nxt[e]=first,vv[e]=v,ww[e]=w,first=e++;
nxt[e]=first[v],vv[e]=u,ww[e]=w,first[v]=e++;
}
for(int i=0;i<W;i++)
{
scanf("%d%d%d",&u,&v,&w);
nxt[e]=first,vv[e]=v,ww[e]=-w,first=e++;
}
if(bellman_ford(N))
printf("NO\n");
else
printf("YES\n");
}
}
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-112261-1-1.html 上篇帖子: 【转载】Exchange 2010配置与安装实用手册 下篇帖子: Exchange Server 2010管理控制台初始化失败解决办法!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表