本文共 1054 字,大约阅读时间需要 3 分钟。
问题描述
给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环)。请你计算从1号点到其他点的最短路(顶点从1到n编号)。输入格式
第一行两个整数n, m。接下来的m行,每行有三个整数u, v, l,表示u到v有一条长度为l的边。
输出格式
共n-1行,第i行表示1号点到i+1号点的最短路。 样例输入 3 3 1 2 -1 2 3 -1 3 1 2 样例输出 -1 -2 数据规模与约定 对于10%的数据,n = 2,m = 2。对于30%的数据,n <= 5,m <= 10。
对于100%的数据,1 <= n <= 20000,1 <= m <= 200000,-10000 <= l <= 10000,保证从任意顶点都能到达其他所有顶点。
spfa模板题吧,数据这么大。还好没什么坑,1A
#include#include #include #include #include #include #include #include #include #include #define INF 0x3f3f3f3f#define MAXN 100005#define Mod 10001using namespace std;struct Edge{ int v,w,next;};Edge edge1[MAXN<<1];int head1[MAXN],n,m,e,vis[MAXN],dis[MAXN];void add(Edge *edge,int *head,int u,int v,int w){ edge[e].v=v; edge[e].w=w; edge[e].next=head[u]; head[u]=e;}void spfa(Edge *edge,int *head,int u){ memset(vis,0,sizeof(vis)); for(int i=1;i<=n;++i) dis[i]=INF; dis[u]=0; queue q; q.push(u); while(!q.empty()) { u=q.front(); q.pop(); vis[u]=1; for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v,w=edge[i].w; if(w+dis[u]
转载地址:http://jacvb.baihongyu.com/