P1807 最长路_NOI导刊2010提高(07)
2017-06-29 21:27
302 查看
题目描述
设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≤100040%的数据,n≤1,000,m≤10000
100%的数据,n≤1,500,m≤50000,最长路径不大于10^9
裸SPFA
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<queue> using namespace std; const int MAXN=500001; struct node { int u; int v; int w; int next; }edge[MAXN]; int num=1; int head[MAXN]; void add(int x,int y,int z) { edge[num].u=x; edge[num].v=y; edge[num].w=z; edge[num].next=head[x]; head[x]=num++; } int dis[MAXN]; int vis[MAXN]; int n,m,s; void SPFA(int s) { dis[s]=0; vis[s]=1; queue<int>q; q.push(s); while(q.size()!=0) { int p=q.front(); q.pop(); vis[p]=0; for(int i=head[p];i!=-1;i=edge[i].next) { int to=edge[i].v; if(dis[to]<dis[p]+edge[i].w) { dis[to]=dis[p]+edge[i].w; if(vis[to]==0) { q.push(to); vis[to]=1; } } } } if(dis ==0) printf("-1"); else printf("%d ",dis ); } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) head[i]=-1,dis[i]=0; for(int i=1;i<=m;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); add(x,y,z); } SPFA(1); 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)