【CF】142 Div.1 B. Planes
2015-07-12 12:56
281 查看
SPFA.注意状态转移条件,ans的求解需要在bfs中间求解。因为只要到了地点n,则无需等待其他tourist。
还是蛮简单的,注意细节。
还是蛮简单的,注意细节。
/* 229B */ #include <iostream> #include <string> #include <map> #include <queue> #include <set> #include <stack> #include <vector> #include <deque> #include <algorithm> #include <cstdio> #include <cmath> #include <ctime> #include <cstring> #include <climits> #include <cctype> #include <cassert> #include <functional> #include <iterator> #include <iomanip> using namespace std; //#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int> #define stpii set<pair<int, int> > #define mpii map<int,int> #define vi vector<int> #define pii pair<int,int> #define vpii vector<pair<int,int> > #define rep(i, a, n) for (int i=a;i<n;++i) #define per(i, a, n) for (int i=n-1;i>=a;--i) #define clr clear #define pb push_back #define mp make_pair #define fir first #define sec second #define all(x) (x).begin(),(x).end() #define SZ(x) ((int)(x).size()) #define lson l, mid, rt<<1 #define rson mid+1, r, rt<<1|1 const int maxn = 1e5+5; const int INF = 0x3f3f3f3f; vpii E[maxn]; vpii T[maxn]; int dis[maxn]; bool visit[maxn]; int a[maxn], b[maxn]; int main() { ios::sync_with_stdio(false); #ifndef ONLINE_JUDGE freopen("data.in", "r", stdin); freopen("data.out", "w", stdout); #endif int n, m; int u, v, w; scanf("%d %d", &n, &m); while (m--) { scanf("%d %d %d", &u, &v, &w); E[u].pb(mp(v, w)); E[v].pb(mp(u, w)); } rep(i, 1, n+1) { scanf("%d", &m); rep(j, 1, m+1) scanf("%d", &a[j]); b[m] = 1; per(j, 1, m) { if (a[j]+1 == a[j+1]) b[j] = b[j+1] + 1; else b[j] = 1; } rep(j, 1, m+1) T[i].pb(mp(a[j], b[j])); } int i, tmp; int ans = INF; pii p(0, 0); vpii::iterator iter; queue<int> Q; Q.push(1); memset(dis, 0x3f, sizeof(dis)); // may be have 0 in T[1] iter = upper_bound(all(T[1]), p); if (iter!=T[1].end() && iter->fir==0) { dis[1] = iter->sec; } else { dis[1] = 0; } visit[1] = true; while (!Q.empty()) { u = Q.front(); Q.pop(); visit[u] = false; for (i=0; i<SZ(E[u]); ++i) { v = E[u][i].fir; w = E[u][i].sec; tmp = dis[u] + w; if (v==n && tmp<ans) ans = tmp; p.fir = tmp; iter = upper_bound(all(T[v]), p); if (iter!=T[v].end() && iter->fir==tmp) { tmp += iter->sec; } if (tmp < dis[v]) { dis[v] = tmp; if (!visit[v]) { visit[v] = true; Q.push(v); } } } } ans = ans==INF ? -1:ans; printf("%d\n", ans); #ifndef ONLINE_JUDGE printf("time = %d.\n", (int)clock()); #endif return 0; }
相关文章推荐
- 德国精品软件 极品系统优化软件 TuneUp Utilities
- 德国精品软件 极品系统优化软件 TuneUp Utilities
- [leetcode][dfs] Lowest Common Ancestor of a Binary Search Tree
- Java多线程(二)、线程的生命周期和状态控制
- 【学习】关于学习编程,大神们的一些建议(记录学习中)
- Sass:初识Sass与Koala工具的使用
- Scrapy初学
- Android中观察者模式:消息分发器(MessageDispatcher)
- 修复VS 2010的Help Library管理器和MSDN的安装过程
- 美团(三)之登录到主页面间的加载界面
- 微软官方Windows主题 英国之美 高分辨率的壁纸
- 微软官方Windows主题 英国之美 高分辨率的壁纸
- Android平台添加外设的架构流程(kernel->HAL->JNI->API->APP)之学习提高篇
- spring 监听器 IntrospectorCleanupListener 防止内存泄露
- NodeJS学习第一季-安装与介绍
- 过程管理和过程高速发展的平台设计思路
- Move System Databases in MS SQL SERVER
- 又见01背包
- $.extend({},defaults, options) --(初体验三)
- itunes真难用,这是什么垃圾