LightOJ - 1086 Jogging Trails(欧拉+状态压缩)
2015-11-09 23:48
399 查看
题目大意:有一个人要跑完所有的路,且要跑的路程最短,问如何跑
解题思路:跑完所有的路,且要跑的路程最短,跑欧拉路肯定是最短的。但是给出的图有可能不是欧拉回路,所以得自己再拼凑一下
无向图的欧拉回路就是所有点的度都是偶数了,所以找出所有度为奇数的点,状压求解连接这些点的最短路
解题思路:跑完所有的路,且要跑的路程最短,跑欧拉路肯定是最短的。但是给出的图有可能不是欧拉回路,所以得自己再拼凑一下
无向图的欧拉回路就是所有点的度都是偶数了,所以找出所有度为奇数的点,状压求解连接这些点的最短路
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 20; const int INF = 0x3f3f3f3f; const int S = (1 << 15) + 10; int dis ; int degree , dp[S]; int ans, n, m, cas = 1; void floyd() { for (int k = 0; k < n; k++) for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) if (dis[i][k] != INF && dis[k][j] != INF && dis[i][j] > dis[i][k] + dis[k][j]) dis[i][j] = dis[i][k] + dis[k][j]; } void init() { scanf("%d%d", &n, &m); memset(dis, 0x3f, sizeof(dis)); for (int i = 0; i < n; i++) { dis[i][i] = 0; degree[i] = 0; } ans = 0; int u, v, d; for (int i = 0 ; i < m; i++) { scanf("%d%d%d", &u, &v, &d); ans += d; u--; v--; dis[u][v] = dis[v][u] = min(d, dis[u][v]); degree[u]++; degree[v]++; } floyd(); } int dfs(int state) { if (state == 0) return 0; if (~dp[state]) return dp[state]; int s; for (int i = 0; i < n; i++) { if (state & (1 << i)) { s = i; break; } } dp[state] = INF; for (int i = s + 1; i < n; i++) if (state & (1 << i)) dp[state] = min(dp[state], dfs(state ^ (1 << s) ^ (1 << i)) + dis[s][i]); return dp[state]; } void solve() { int state = 0; for (int i = 0; i < n; i++) if (degree[i] % 2) { state |= (1 << i); } memset(dp, -1, sizeof(dp)); ans += dfs(state); printf("Case %d: %d\n", cas++, ans); } int main() { int test; scanf("%d", &test); while (test--) { init(); solve(); } return 0; }
相关文章推荐
- 【Alpha】Daily Scrum Meeting第七次
- 【Alpha】Daily Scrum Meeting第七次
- TinyOS06:Avrora的Mailing List
- poj 2010 Moo University - Financial Aid 优先队列
- fibonacci && climbing-stairs
- LightOJ 1021 - Painful Bases(dp)
- http://blog.csdn.net/jadyer/article/details/6013743
- hdu 3264 Open-air shopping malls(几何)
- hdu4770 Lights Against Dudely
- Gradle project sync failed. Please fix your project and try again.
- 正确使用Block避免Cycle Retain和Crash
- Scala初学者学习资料:main(String[])
- 运行Scala应用 Main方法
- .NET 4.0 使用 asyn await
- 父进程等待子进程结束 waitpid wait
- Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON
- git常见错误failed to push some refs to
- NovaException: Unexpected vif_type=binding_failed
- LightOJ 1138 Trailing Zeroes (III)(二分 + 思维)
- 重新启动SNMP服务解决监控AIX系统问题