2017 ACM-ICPC 亚洲区(乌鲁木齐赛区) 网络赛 H.Skiing(求有向无环图的最长路)
2017-09-09 19:37
579 查看
试题链接:Skiing
题解:拓扑排序+DP,取出度为0的点的最大值
题解:拓扑排序+DP,取出度为0的点的最大值
#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #include <cstring> #include <map> #include <stack> #include <set> #define Max(a,b) a>b?a:b #define Min(a,b) a>b?b:a #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; typedef long long ll; int dir[4][2]= {{1,0},{-1,0},{0,1},{0,-1}}; const double eps = 1e-6; const double Pi = acos(-1.0); const int INF=0x3f3f3f3f; int vel[100005]; ll dis[100005], ans; int in[100005];//记录每个点的入度 int out[100005];//记录每个点的出度 int head[100005], len;//head[i]=j表示以i为起点的边的编号为j int n, m; int tnum[100005], nnum[100005]; struct edge { int to,val,next; }e[1000005]; void add(int from,int to,int val) { e[len].to=to; e[len].val=val; e[len].next=head[from]; head[from]=len++; } void TopSort() { priority_queue<int, vector<int>, greater<int> > q;//优先队列 按照由小到大的顺序 q.push(0); int cnt = 0; while(!q.empty()) { int u = q.top(); q.pop(); cnt++; tnum[u] = cnt;//从1开始记录出队的顺序 for(int i=head[u]; i!=-1; i=e[i].next) { int v = e[i].to; in[v]--; if(!in[v]) q.push(v); } } dis[0] = 0; for(int i=1; i<=n; i++) nnum[tnum[i]-1] = i; //比如tnum[u] = 1表示点u是第1个出队的,那么nnum[tnum[u] - 1] = u -> nnum[0] = u, //这样nnum[i] = j就维护了第i个出队的点是j for(int i=0; i<=n; i++) { for(int j=head[nnum[i]]; j!=-1; j=e[j].next) { int t = e[j].to; dis[t] = max(dis[t], dis[nnum[i]]+e[j].val); } } } int main() { int t; scanf("%d", &t); while(t--) { scanf("%d%d", &n, &m); len = 0; ans = -INF; fill(dis, dis+n+1,-INF); mem(in, 0); mem(out, 0); mem(head, -1); for(int i=1; i<=m; i++) { int x, y, v; scanf("%d%d%d", &x, &y, &v); add(x, y, v); out[x]++; in[y]++; } for(int i=1; i<=n; i++) if(!in[i]) { add(0, i, 0); out[0]++; in[i]++; } TopSort(); // for(int i=1; i<=n; i++) if(out[i]==0) ans = max(ans, dis[i]); printf("%lld\n", ans); } }
相关文章推荐
- 计蒜客-2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛H题Skiing(拓扑序求DAG最长路)
- 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛-H Skiing
- 计蒜客-2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛G题Query on a strin(树状数组+暴力更新)
- 重要-- 模板 计蒜客-2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛J题Our Journey of Dalian Ends (最小费用最大流)
- [计蒜客16955] Islands [2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 F]
- Skiing( 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 )
- 计蒜客-2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛J题Our Journey of Dalian Ends (最小费用最大流)
- 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 Query on a string(字符串+树状数组)
- H. Skiing 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛
- 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 E.Half-consecutive Numbers
- 计蒜客 16957 Skiing(2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 H)
- 计蒜客-2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛-H-Skiing
- 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 H. Skiing
- 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛
- 计蒜客-2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛-总结及部分代码
- 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛-A. Banana
- 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 H
- 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛J
- 计蒜客 16950 Banana(2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 A)
- 2017 ACM-ICPC 亚洲区(北京赛区)网络赛