最短路
题目在链接中。
首先看到这个题就是肯定能想到最短路的,但是呢,看看这个数据范围,如果把两点之间的边权存起来,200000*200000肯定是要爆了,这是我固化的用最短路的算法dijkstra来考虑,存起来嘛,然后关键来了,就是我们可以不存起来,而是边找边算。
到1号位置的距离,只需一个dis数组来存储,输入每条边的信息,分别用数组存起来,直接根据坐标来调用每条边的信息。
遍历n-1次,然后每次都要遍历m条边,直到这n-1次遍历中,有一回进来,找遍m条边都没有了更新的情况,那说明都已经是最小的了,停止,下一步输出。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod = 1e9 + 7;
const int maxn = 2e5 + 100;
int dis[maxn],u[maxn],v[maxn],w[maxn];
int main()
{
int n,m;
int inf=99999999;
cin>>n>>m;
for(int i=0; i<m; i++)
cin>>u[i]>>v[i]>>w[i];
for(int i=0; i<=n; i++)
dis[i]=inf;
dis[1]=0;
int flag;
for(int k=1; k<=n-1; k++)
{
flag=0;
for(int i=0; i<m; i++)
{
if(dis[v[i]]>dis[u[i]]+w[i]&&dis[u[i]]<inf)
{
flag=1;
dis[v[i]]=dis[u[i]]+w[i];
}
}
if(flag==0)
break;
}
for(int i=2; i<=n; i++)
cout<<dis[i]<<endl;
return 0;
}