POJ
来源:互联网 发布:iphone 同步软件 编辑:程序博客网 时间:2024/05/29 04:40
题目大意:
一个有向图,给你n个点,m条双向路径,以及t条虫洞。每条路径描述在两个点ab之间移动需要时间v。每条虫洞描述从a到b需要时间-v(类似于时空穿越)。现在就问你,一个人能否从某个点开始,通过若干次虫洞和路径,在他出发之前的每个时刻回到出发点。注意:两个点之间有可能有多条路径!
分析:
相当于找一个有向图中的负权回路。关于两个点之间可能有多条路径这个事情,在存图的时候要好好考虑一下。比如两个点AB之间有两条路径a,b(va>vb)以及一条虫洞单向c,那么,为了形成负权环路,我的存储方式应该是:map [ A ] [ B ] = - vc ; map [ B ] [ A ] = vb; 因为如果某条负权回路经过边a,那么,那这条边改成b也一定是负权回路(va>vb),如果经过b,那么,把这条边改成c也一定是负权回路(vb>0>-vc)。所以我选择先把合适的值存到map数组里,在遍历map数组来得到所有的有向边。时间复杂度:
代码:
#include<iostream>#include<string.h>#define inf 0x3f3f3f3fusing namespace std;struct edge{ int s; int e; int v;}l[2600]={0};int num=1;int map[550][550];int n,m,t;int flag=0;void my_Bellman_Ford(){ int dis[550]={0}; dis[1]=0; flag=0; for(int k=1;k<n;k++) { for(int i=1;i<=num;i++) { if(dis[l[i].e]>dis[l[i].s]+l[i].v) { dis[l[i].e]=dis[l[i].s]+l[i].v; } } } for(int i=1;i<=num;i++) { if(dis[l[i].e]>dis[l[i].s]+l[i].v) { flag=1; return; } }}int main(){ int test; cin>>test; while(test--) { cin>>n>>m>>t; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { map[i][j]=inf; } } int ls,le,lv; for(int i=1;i<=m;i++) { cin>>ls>>le>>lv; if(map[ls][le]>lv) { map[ls][le]=lv; map[le][ls]=lv; } } for(int i=1;i<=t;i++) { cin>>ls>>le>>lv; map[ls][le]=-lv; } num=1; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(map[i][j]!=inf) { l[num].s=i; l[num].e=j; l[num].v=map[i][j]; num++; } } } num--; my_Bellman_Ford(); if(flag==1)cout<<"YES"<<endl; else cout<<"NO"<<endl; }}
后记:
这道题本来是训练计划里的一道,当时并没做出来,然后就莫名其妙给忘记了,现在回来一看,突然感觉简单了好多。变强中···
0 0
- POJ
- poj
- POJ
- POJ
- poj
- poj
- POJ
- POJ
- poj
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- HEX文件和BIN文件格式的区别
- 19.Unity3D商业游戏源码研究-变身吧主公-战斗-MainPlayerStateHit
- 软件性能测试_Loadrunner正则表达式关联
- TextControl 单位
- 详解BarTender数据源操作列表
- POJ
- Spring Boot 学习3--热部署
- 20.Unity3D商业游戏源码研究-变身吧主公-战斗-MainPlayerStateIdle
- [Ruby On Rails]Rails中的ActiveSupport::Callbacks的使用
- 关于HTTP协议,一篇就够了
- 【JavaScript】第一个Demo和一个问题
- jvm中堆和非堆的划分
- 到底什么时候该使用MQ?
- C++读取txt文件