全部评论 3

  • // Dijkstra算法:单源最短路径(仅限非负权图)

    #include<bits/stdc++.h>
    using namespace std;
    using i64=long long;
    const i64 INF=1e9;
    int main() {
        int n,m,s;
        cin>>n>>m>>s;
    
        vector<vector<pair<int,i64>>> edge(n + 1);
        for(int i = 1 ; i <= m ; i ++){
            int u,v,w;
            cin >> u >> v >>w;
            edge[u].push_back({v,w});
        }
    
    	vector<i64> dist(n + 1, INF);
    	vector<bool> visited(n + 1, false);
    	priority_queue<pair<i64, int>, vector<pair<i64, int> >, greater<> > pq;
    	// 初始化源点
    	dist[s] = 0;
    	pq.emplace(0, s);
    	while (!pq.empty()) {
    		auto top = pq.top();
            i64 d=top.first,u=top.second;
    		pq.pop();
    		if (visited[u]) continue;
    		visited[u] = true;
    		for (const auto &e: edge[u]) {
    			int v = e.first;
    			i64 w = e.second;
    if (d +w < dist[v]) {
    				dist[v] = d + w;
    				pq.emplace(dist[v], v);
    			}
    		}
    	}
    	for(int i=1;i<=n;++i)cout<<dist[i]<<" ";
    }
    

    2025-08-06 来自 浙江

    0
  • // Bellman-Ford 算法(双数组实现)

    #include<bits/stdc++.h>
    using namespace std;
    using i64=long long;
    const i64 INF=1e9;
    struct node {
    	i64 u,v,w;
    };
    int main() {
    	int n,m,s;
    	cin>>n>>m>>s;
    	vector <i64> dis(n+1,INF);
    
    	dis[s]=0;
    	vector <node> edge(m+1);
    	for(int i=1; i<=m; ++i) {
    		cin>>edge[i].u>>edge[i].v>>edge[i].w;
    	}
    
    	for(int i=1; i<=n; ++i) {
    		vector<i64> tmp=dis;
    		for(int j=1; j<=m; ++j) {
    			int u=edge[j].u,v=edge[j].v,w=edge[j].w;
    			tmp[v]=min(tmp[v],dis[u]+w);
    		}
    		swap(tmp,dis);
    	}
    
    	vector<i64> tmp=dis;
    	for(int j=1; j<=m; ++j) {
    		int u=edge[j].u,v=edge[j].v,w=edge[j].w;
    		tmp[v]=min(tmp[v],dis[u]+w);
    	}
    
    	for(int i=1; i<=n; ++i) {
    		if(tmp[i]!=dis[i]) {
    			cout<<"no solution";
    			return 0;
    		}
    	}
    
    	for(int i=1; i<=n; ++i) {
    		cout<<(dis[i]==INF? -1:dis[i])<<" ";
    	}
    	return 0;
    }
    

    2025-08-06 来自 浙江

    0
  • // Floyd算法:全源最短路径

    #include<bits/stdc++.h>
    using namespace std;
    using i64=long long;
    const i64 INF=1e9;
    int main(){
        int n,m;
        cin>>n>>m;
        vector <vector<i64>> dis(n+1,vector <i64>(n+1,INF));
        for(int i=1;i<=n;++i)dis[i][i]=0;
        
        for(int i=1;i<=m;++i){
            i64 u,v,w;
            cin>>u>>v>>w;
            dis[u][v]=min(dis[u][v],w);
        }
        
        for(int k=1;k<=n;++k){
            for(int i=1;i<=n;++i){
                for(int j=1;j<=n;++j){
                    if(dis[i][k]==INF||dis[k][j]==INF)continue;
                    dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
                }
            }
        }
    
        for(int i=1;i<=n;++i){
            if(dis[i][i]<0){
                cout<<-1;
                return 0;
            }
        }
    
        for(int i=1;i<=n;++i){
            for(int j=1;j<=n;++j){
                cout<<dis[i][j]<<" ";
            }
            cout<<endl;
        }
    
        return 0;
    }
    
    

    2025-08-06 来自 浙江

    0
暂无数据

提交答案之后,这里将显示提交结果~

首页