题目描述:有n个点给你m条有向边和起始点s 让你输出任一点到s的最短路
分析: 试着用spfa写了下 注意时间复杂度是O(nv) (大于等于n*n)
ac代码:
#include<bits/stdc++.h> using namespace std; typedef pair<int,int> P; vector<P>G[10030]; long long dis[10030]; int vis[10030]; int main(){ // freopen("1.txt","r",stdin); ios::sync_with_stdio(0); cin.tie(0); int n,m,s; cin>>n>>m>>s; for(int i=0;i<m;i++){ int x,y,c; cin>>x>>y>>c; G[x].push_back(P(c,y)); } fill(dis,dis+10030,2147483647); memset(vis,0,sizeof vis); dis[s]=0; queue<int>que; que.push(s); while(!que.empty()){ int now=que.front(); que.pop(); vis[now]=0; for(int i=0;i<G[now].size();i++){ P p=G[now][i]; if(dis[p.second]>dis[now]+p.first){ dis[p.second]=dis[now]+p.first; if(!vis[p.second]){ vis[p.second]=1; que.push(p.second); } } } } for(int i=1;i<=n;i++){ cout<<dis[i]; if(n!=i)cout<<' '; else cout<<endl; } }