问题描述 给定一个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 <iostream>#include <cstring>#include <string>#include <vector>#include <queue>#include <cstdio>#include <set>#include <cmath>#include <algorithm>#include <queue>#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<int> 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]<dis[v]) { dis[v]=w+dis[u]; if(!vis[v]) { vis[v]=1; q.push(v); } } } }}int main(){ scanf("%d%d",&n,&m); e=0; int u,v,w; memset(head1,-1,sizeof(head1)); while(m--) { scanf("%d%d%d",&u,&v,&w); add(edge1,head1,u,v,w); e++; } spfa(edge1,head1,1); for(int i=2;i<=n;++i) PRintf("%d/n",dis[i]); return 0;}新闻热点
疑难解答