DUT 胡老师的跨国逃亡
来源:互联网 发布:金牛奇迹mac版 编辑:程序博客网 时间:2024/04/30 20:36
这是我在学习图论时一本参考资料上的例题,觉得有趣就写了写。
题目大意请进:胡老师的跨国逃亡
大概思路:第一次我思考时,首先是找到A国中的边界点,然后找出1到边界点距离的最小值,然后通过通过spfa枚举边界点的去找离2的最小值,但这样应该会超时。于是我将地图预处理了一下,首先找到1离A中所有的点的最短路,然后去找2离B中所有的点的最短路。这里需要注意一下的就是怎么样去保证d[i]一定是代表一个国家之内的最小值,这里我们可以加一个判断,即vis[v] == f。记得把初始值d[src]置为0,这样,我们最后求得的距离一定是国家与国家之间的最小值。
怎么去找边界点呢?我们可以另外开一个数组来存储边,这样只要vis[u] != vis[v]的话,说明它就是边界点,由于d[i]一定代表国家与国家之间的最小值,然后通过枚举判断最小值即可。
#include <iostream>#include <cstring>#include <string>#include <cstdio>#include <cstdlib>#include <map>#include <queue>using namespace std;const int MAXN = 3010;const int MAXM = 500510;const int INF = 0x3f3f3f3f;struct Edge{int u, v, w;int next;}edge[MAXN], Save[MAXN]; //Save储存边的值int n, m;int cnt;int first[MAXN], d[MAXN];int vis[MAXN];void init(){cnt = 0;memset(first, -1, sizeof(first));memset(vis, 0, sizeof(vis));memset(d, INF, sizeof(d));}void read_graph(int u, int v, int w){edge[cnt].v = v, edge[cnt].w = w;edge[cnt].next = first[u], first[u] = cnt++;}void read_case(){init();for(int i = 1; i <= m; i++){int u, v, w;scanf("%d%d%d", &u, &v, &w);read_graph(u, v, w);read_graph(v, u, w);Save[i].u = u, Save[i].v = v, Save[i].w = w;}int f;for(int i = 1; i <= n; i++){scanf("%d", &f);vis[i] = f;}}void spfa(int src, int f){queue<int> q;bool inq[MAXN] = {0};d[src] = 0; //初始点需要置0 q.push(src);while(!q.empty()){int x = q.front(); q.pop();inq[x] = 0;for(int e = first[x]; e != -1; e = edge[e].next){int v = edge[e].v, w = edge[e].w;if(d[v] > d[x] + w && vis[v] == f) //枚举每个A或者B国家中到源点的最短距离{d[v] = d[x] + w;if(!inq[v]){inq[v] = 1;q.push(v);}}}}}void solve(){int ans = INF;read_case();spfa(1, 1);spfa(2, 2);for(int i = 1; i <= m; i++){int u = Save[i].u, v = Save[i].v, w = Save[i].w; //储存边,枚举时需要用到 if(vis[u] != vis[v]){if(d[u] + d[v] + w < ans){ans = d[u] + d[v] + w;}}}if(ans < INF){printf("%d\n", ans);}else printf("-1\n");}int main(){while(~scanf("%d%d", &n, &m)){solve();}return 0;}
- DUT 胡老师的跨国逃亡
- DUT 胡老师教你做图论
- dut oj 1015 老师的名单(字符串也可以异或)
- 华为跨国营销的"中国功夫"
- 管理跨国虚拟团队的技巧
- 逃亡的准备
- 逃亡的准备(hallows)
- 【9918】逃亡的准备
- SSL_1236 逃亡的准备
- DUT 1009 很久以前的第一次写排序+二分
- DUT 1006 视力表 (打印图形的模拟题)
- dut oj 1058 求能组成的数字
- 逃亡
- F1 中国盛宴 跨国汽车豪门的睡衣派对
- 〔转〕2005:跨国并购的价值冲突
- 2005年跨国软件企业的人均软件生产总值
- 跨国汽车零部件公司在中国的投资项目
- ISTQB测试认证:跨国软件公司的职场通行证
- 报表开发工具
- SQLSERVER 2005 表分区说明
- 如何搭建一个网站优化系统?
- 【转·开发技术】C#实现 [忘记密码] 通过【邮箱取回密码】功能
- 解析jquery实现回车键提交表单
- DUT 胡老师的跨国逃亡
- 报表开发工具
- SqlServer表分区
- linux 双机热备 Heartbeat
- .xcconfig file in XCode
- Oracle 数据压缩(Compression) 技术 说明
- S3C6410 SD卡启动uboot分析
- php之smarty模板自定义标签
- GIT基本概念和用法总结