思维题(转换) HDU 4370 0 or 1
2015-12-01 14:44
309 查看
题目传送门
题意:题目巨晦涩的传递出1点和n点的初度等于入度等于1, 其余点出度和入度相等
分析:求最小和可以转换成求最短路,这样符合条件,但是还有一种情况.1点形成一个环,n点也形成一个环,这样也是可以的,这样SPFA要稍微修改点,d[s] = INF,表示可以更新.
题意:题目巨晦涩的传递出1点和n点的初度等于入度等于1, 其余点出度和入度相等
分析:求最小和可以转换成求最短路,这样符合条件,但是还有一种情况.1点形成一个环,n点也形成一个环,这样也是可以的,这样SPFA要稍微修改点,d[s] = INF,表示可以更新.
#include <bits/stdc++.h> using namespace std; const int N = 3e2 + 5; const int INF = 0x3f3f3f3f; int w ; int d ; bool vis ; int n; void SPFA(int s) { memset (vis, false, sizeof (vis)); queue<int> que; for (int i=1; i<=n; ++i) { if (i == s) d[s] = INF; else { d[i] = w[s][i]; vis[i] = true; que.push (i); } } while (!que.empty ()) { int u = que.front (); que.pop (); vis[u] = false; for (int i=1; i<=n; ++i) { if (d[i] > d[u] + w[u][i]) { d[i] = d[u] + w[u][i]; if (!vis[i]) { vis[i] = true; que.push (i); } } } } } int main(void) { while (scanf ("%d", &n) == 1) { for (int i=1; i<=n; ++i) { for (int j=1; j<=n; ++j) { scanf ("%d", &w[i][j]); } } SPFA (1); int ans = d ; int a1 = d[1]; SPFA (n); int a2 = d ; printf ("%d\n", min (ans, a1 + a2)); } return 0; }
相关文章推荐
- TopCoder SRM674 div1 250
- Android获取图片任意一点的RGB值
- IOS的xcode7的不需要开发者账号的调试步骤
- 全新模版型社交技术产品交响圈白皮书——箭扣科技Arrownock
- IPC More
- [Mac技巧]非Mac键盘/PC键盘 互换Win Alt 按键功能
- Android 使用SharedPreferences 进行保存账号or密码or其它数据
- DB2中导出数据库的所有DDL脚本
- 深入浅出SharePoint——Search疑难排除
- c++相关知识
- 从零开始配置Jenkins(二)——常见问题及排错思路
- 简单的开始,努力的前行。
- Magento2 create a new module
- C_1:linux系统基础
- 大表数据插入批量提交
- Swift回调及notifition消息机制
- 如何修改Blobs Storage Size的最小值以及如何验证Blob已经被存储到自定义的Blob Store里
- 怎么得到网页中的SWF文件
- mysql 指导
- 毕设周记——需求分析