●POJ 2983 Is the Information Reliable?
题链:
http://poj.org/problem?id=2983
题解:
差分约束。
1).对于条件(P u v w),不难发现反映到图上就是:
dis[u]−dis[v]=w,所以添加两条边:
u → v : -w
v → u : w
2).对于条件(V,u,v),反映到图上即为:
dis[u]−dis[v]>=1,所以添加一条边:
v → u : 1
建好图后,dfs版spfa判一下是否存在正环就好了。
(出现正环代表Unreliable,否则就是Reliable)
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #include<cstdio> #include<cstring> #include<iostream> #define MAXN 1050 #define MAXM 100050 using namespace std; struct Edge{ int to[MAXM*2],nxt[MAXM*2],val[MAXM*2],head[MAXN],ent; void Reset(){ent=2; memset (head,0, sizeof (head));} void Adde( int u, int v, int w){ to[ent]=v; val[ent]=w; nxt[ent]=head[u]; head[u]=ent++; } }E; int dis[MAXN],mark[MAXN]; int N,M; bool dfs( int u){ if (mark[u]) return 1; mark[u]=1; for ( int i=E.head[u];i;i=E.nxt[i]){ if (dis[E.to[i]]>=dis[u]+E.val[i]) continue ; dis[E.to[i]]=dis[u]+E.val[i]; if (dfs(E.to[i])) return mark[u]=0,1; } return mark[u]=0,0; } bool check(){ memset (dis,0, sizeof (dis)); for ( int i=1;i<=N;i++) if (dfs(i)) return 0; return 1; } int main(){ char cmd; int u,v,w; while (~ scanf ( "%d%d" ,&N,&M)){ E.Reset(); for ( int i=1;i<=M;i++){ scanf ( " %c%d%d" ,&cmd,&u,&v); if (cmd== 'P' ){ scanf ( "%d" ,&w); E.Adde(v,u,w); E.Adde(u,v,-w); } else E.Adde(v,u,1); } if (check()) printf ( "Reliable\n" ); else printf ( "Unreliable\n" ); } return 0; } |
Do not go gentle into that good night.
Rage, rage against the dying of the light.
————Dylan Thomas
分类:
最短路
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用