最短路 蓝桥杯

来源:互联网 发布:c aes加密解密算法 编辑:程序博客网 时间:2024/06/17 13:50
  算法训练 最短路  时间限制:1.0s   内存限制:256.0MB      问题描述给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环)。请你计算从1号点到其他点的最短路(顶点从1到n编号)。输入格式第一行两个整数n, m。接下来的m行,每行有三个整数u, v, l,表示u到v有一条长度为l的边。输出格式共n-1行,第i行表示1号点到i+1号点的最短路。样例输入3 31 2 -12 3 -13 1 2样例输出-1-2数据规模与约定对于10%的数据,n = 2,m = 2。对于30%的数据,n <= 5,m <= 10。对于100%的数据,1 <= n <= 20000,1 <= m <= 200000,-10000 <= l <= 10000,保证从任意顶点都能到达其他所有顶点。*/#include<iostream>#include<vector>#include<queue>#define MAX 20005#define MAX_E 2000005#define INF 0x3f3f3f3fusing namespace std;struct Edge{int from,to,cost;Edge(int f,int t,int c):from(t),to(t),cost(c){};};vector<Edge>edge[MAX_E];int n,m,Mincost[MAX],visit[MAX],cn[MAX];void SPFA(int s){fill(Mincost,Mincost+n,INF);Mincost[s]=0,visit[s]=1;queue<int>q; q.push(s);cn[s]++;while(!q.empty()){int tNode=q.front(); q.pop();visit[tNode]=0;for(int i=0;i<edge[tNode].size();i++){Edge e=edge[tNode][i];int id=e.to;if(Mincost[id]>Mincost[tNode]+e.cost){Mincost[id]=Mincost[tNode]+e.cost;if(!visit[id]){visit[id]=1;q.push(id); if(++cn[id]>n){return ;}}} }}}int main(){cin>>n>>m;for(int i=0;i<m;i++){int u,v,l; cin>>u>>v>>l;Edge e(u,v,l);edge[u].push_back(e); }SPFA(1);for(int i=2;i<=n;i++){cout<<Mincost[i]<<endl;}}

0 0
原创粉丝点击