P1807 最长路_NOI导刊2010提高(07)
2017-06-29 21:23
302 查看
P1807 最长路_NOI导刊2010提高(07)
题目描述
设G为有n个顶点的有向无环图,G中各顶点的编号为1到n,且当为G中的一条边时有i < j。设w(i,j)为边的长度,请设计算法,计算图G中<1,n>间的最长路径。
输入输出格式
输入格式:
输入文件longest.in的第一行有两个整数n和m,表示有n个顶点和m条边,接下来m行中每行输入3个整数a,b,v(表示从a点到b点有条边,边的长度为v)。
输出格式:
输出文件longest.out,一个整数,即1到n之间的最长路径.如果1到n之间没连通,输出-1。
输入输出样例
输入样例#1:2 1 1 2 1输出样例#1:
1
说明
20%的数据,n≤100,m≤1000
40%的数据,n≤1,000,m≤10000
100%的数据,n≤1,500,m≤50000,最长路径不大于10^9
spfa最长路
#include<cstdio> #include<algorithm> #include<cstring> #include<queue> using namespace std; const int MAXN = 1510; struct Edge{ int to,w,nxt; }e[50100]; int dis[MAXN]; int head[MAXN]; bool vis[MAXN]; queue<int>q; int n,m,cnt; void add(int u,int v,int w) //从u到v有一条长度是w的边 { ++cnt; e[cnt].to = v; e[cnt].w = w; e[cnt].nxt = head[u]; head[u] = cnt; } void spfa() { for (int i=1; i<=n; ++i) dis[i] = -1; dis[1] = 0; q.push(1); vis[1] = true; while (!q.empty()) { int u = q.front(); q.pop(); for (int i=head[u]; i; i=e[i].nxt) { int v = e[i].to; int w = e[i].w; if (dis[v]<dis[u]+w) { dis[v] = dis[u]+w; if (!vis[v]) { q.push(v); vis[v] = true; } } } vis[u] = false; } } int main() { scanf("%d%d",&n,&m); for (int u,v,w,i=1; i<=m; ++i) { scanf("%d%d%d",&u,&v,&w); add(u,v,w); } spfa(); printf("%d",dis ); return 0; }
相关文章推荐
- P1807 最长路_NOI导刊2010提高(07)--最长路
- 洛谷 P1807 最长路_NOI导刊2010提高(07)
- P1807 最长路_NOI导刊2010提高(07)
- P1807 最长路_NOI导刊2010提高(07)
- 洛谷1807 最长路 NOI导刊2010提高(07)
- [luoguP1773] 符文之语_NOI导刊2010提高(02)(DP)
- 洛谷P1776 宝物筛选_NOI导刊2010提高(02)
- 洛谷 P1776 宝物筛选_NOI导刊2010提高(02)
- 洛谷P1774 最接近神的人_NOI导刊2010提高(02)(求逆序对)
- [NOI导刊2010提高&洛谷P1774]最接近神的人 题解(树状数组求逆序对)
- 洛谷P1801 黑匣子_NOI导刊2010提高(06)
- P1801 黑匣子_NOI导刊2010提高(06)
- 洛谷—— P1775 古代人的难题_NOI导刊2010提高(02)
- 洛谷 P1774 最接近神的人_NOI导刊2010提高(02)
- NOI导刊2010提高(06) 黑匣子
- 黑匣子_NOI导刊2010提高(06)(对顶堆)
- P1800 software_NOI导刊2010提高(06)(二分答案)
- 洛谷P1801 黑匣子_NOI导刊2010提高(06)
- 淘汰赛制(NOI导刊2010提高 01)
- 洛谷——P1774 最接近神的人_NOI导刊2010提高(02)