spfa算法
给定一个
请你求出 impossible。
数据保证不存在负权回路。
输入格式
第一行包含整数
接下来
输出格式
输出一个整数,表示
如果路径不存在,则输出 impossible。
数据范围
图中涉及边长绝对值均不超过
输入样例:
3 3
1 2 5
2 3 -3
1 3 4
输出样例:
2
其实我是喜欢这个算法来着
总的思路就是找到所有应该更新的那个点,加入队列,然后类似于bfs
#include#include #include using namespace std; int n,m; const int N=1e5+10; int h[N],e[N],ne[N],w[N],idx; int dist[N]; bool st[N]; void add(int a,int b,int c) { e[idx]=b; w[idx]=c; ne[idx]=h[a]; h[a]=idx++; } int spfa() { memset(dist,0x3f,sizeof(dist)); dist[1]=0; queue<int> q; q.push(1); while(q.size()) { auto t=q.front(); q.pop(); st[t]=false;//防止队列里有重复元素 for(int i=h[t];i!=-1;i=ne[i])//枚举t的所有出边 { int j=e[i]; if(dist[j]>dist[t]+w[i]) { dist[j]=dist[t]+w[i];//直接更新 if(!st[j]) { q.push(j); st[j]=true; } } } } if(dist[n]==0x3f3f3f3f) return -1; else return dist[n]; } int main(){ cin>>n>>m; memset(h,-1,sizeof(h)); for(int i=1;i<=m;i++) { int a,b,c; cin>>a>>b>>c; add(a,b,c); } int t=spfa(); if(t==-1) cout<<"impossible"<<endl; else cout< endl; return 0; }