1 条题解

  • 0
    @ 2025-2-21 19:55:52

    C :

    #include <stdio.h>
    #include <string.h>
    int edge[51][51],isvisited[51],n,m,s,lowcost[51];
    void dijkstra(int vo){
    	int i,j,min,pre;
    	isvisited[vo]=1;
    	for (i=0;i<n;i++)
    	{
    		lowcost[i]=edge[vo][i];
    
    	}
    	lowcost[vo]=0;
    	pre=vo;
    	for (i=1;i<n;i++)
    	{
    		min=100000000;
    		for (j=0;j<n;j++)
    		{
    			if (isvisited[j]==0&&min>lowcost[j])
    			{
    				min=lowcost[j];
    				pre=j;
    			}
    		}
    		isvisited[pre]=1;
    		for (j=0;j<n;j++)
    		{
    			if (isvisited[j]==0&&lowcost[j]>edge[pre][j]+lowcost[pre])
    			{
    				lowcost[j]=edge[pre][j]+lowcost[pre];
    			}
    		}
    	}
    }
    int main(){
    	int i,j;
    //	freopen("1.txt","r",stdin);
    	while (scanf("%d %d",&n,&s)!=EOF)
    	{
    		memset(isvisited,0,sizeof(isvisited));
    		for (i=0;i<n;i++)
    		{
    			for (j=0;j<n;j++)
    			{
    				scanf("%d",&edge[i][j]);
    				if (edge[i][j]==0)
    				{
    					edge[i][j]=100000000;
    				}
    			}
    		}
    		dijkstra(s);
    		for (i=0;i<n;i++)
    		{
    			if (i!=s)
    			{
    				if (lowcost[i]==100000000)
    				{
    					printf("-1 ");
    				}else{
    					printf("%d ",lowcost[i]);
    				}
    			}
    		}
    		printf("\n");
    	}
    //	fclose(stdin);
    	return 0;
    }
    

    C++ :

    #include <cstdio>
    #include <cstdlib>
    #include <stack>
    #include <algorithm>
    using namespace std;
    const int MAXN = 50;
    const int INF = 1000000000;
    int mat[MAXN][MAXN], min_distance[MAXN], v[MAXN];
    int n, s;
    
    void dijkstra() {
    	int i, j, k;
    	for (i = 0; i < n; i++) {
    		min_distance[i] = INF;
    		v[i] = 0;
    	}
    	for (min_distance[s] = 0, j = 0; j < n; j++) {
    		for (k = -1, i = 0; i < n; i++) {
    			if (!v[i] && (k == -1 || min_distance[i] < min_distance[k])) {
    				k = i;
    			} 
    		}
    		for (v[k] = 1, i = 0; i < n; i++) {
    			if (!v[i] && min_distance[k] + mat[k][i] < min_distance[i]) {
    				min_distance[i] = min_distance[k] + mat[k][i];
    			} 
    		}
    	}
    }
    int main() {
    	scanf("%d%d", &n, &s);
    	for (int i = 0;i < n;i++) {
    		for (int j = 0;j < n;j++) {
    			scanf("%d", &mat[i][j]);
    			if (mat[i][j] == 0)
    				mat[i][j] = INF;
    		}
    	}
    	dijkstra();
    	for (int i = 0;i < n;i++) {
    		if (i != s) {
    			if (min_distance[i] < INF)
    				printf("%d ", min_distance[i]);
    			else
    				printf("%d ", -1);
    		}
    	}
    	puts("");
    	return 0;
    }
    

    Pascal :

    const MAXDATA=1000;
    var
     a:array[0..100,0..100] of integer;
     dis:array[0..100] of integer;
     fg:array[0..100] of boolean;
     n,s,i,j,min:integer;
    
    function remin(a,b:integer):integer;
    begin
     if a<b then exit(a) else exit(b);
    end;
    
    procedure dijkstra(s:integer);
    var
     i,j,k:integer;
    begin
     for i:=0 to n do
      begin
       fg[s]:=true;
       for j:=0 to n do
        begin
         if (a[s,j]<>0) and (fg[j]=false) then
          dis[j]:=remin(dis[j],dis[s]+a[s,j]);
        end;
    
       //writeln('xxxx');
       min:=MAXDATA;
      for k:=0 to n do
       for j:=0 to n do
        if(a[k,j]<>0) and (fg[j]=false) then
         if min>dis[j] then
          begin
           min:=dis[j];
           s:=j;
          end;
      end;
    
    end;
    
    procedure output;
    var
     i:integer;
    begin
     for i:=0 to n do
      if i<>s then
       if dis[i]=MAXDATA then write('-1 ') else write(dis[i],' ');
    end;
    
    begin
     readln(n,s);
     dec(n);
     for i:=0 to n do
      for j:=0 to n do
       read(a[i,j]);
    
     fillchar(fg,sizeof(fg),false);
     for i:=0 to n do dis[i]:=MAXDATA;
     dis[s]:=0;
     dijkstra(s);
     output;
     //writeln('wwwwww');
    end.
    
    

    Java :

    import java.util.ArrayList;
    import java.util.Comparator;
    import java.util.List;
    import java.util.PriorityQueue;
    import java.util.Queue;
    import java.util.Scanner;
     
    public class Main {
        static class Node{
            public Node(int v,int w) {
                this.v=v;
                this.w=w;
            }
            int v;
            int w;
        }
        static class R{
            public R(int vertex) {
                this.vertex=vertex;
                this.distance=Integer.MAX_VALUE;
            }
            int vertex;
            int distance;
            int number;
            int people;
        }
        static Comparator<R> com=new Comparator<R>() {
     
            @Override
            public int compare(R o1, R o2) {
                return o1.distance-o2.distance;
            }
             
        };
        static Scanner scn=new Scanner(System.in);
        static int vertex=scn.nextInt(),start=scn.nextInt();
        static List<List<Node>> G=new ArrayList<>();
        static boolean[] visit=new boolean[vertex];
        static R[] form=new R[vertex];
        static Queue<R> pri=new PriorityQueue<>(com);
        public static void main(String[] args) {
    //      初始化
            for(int i=0;i<vertex;i++) {
                G.add(new ArrayList<>());
                form[i]=new R(i);
            }
    //      创建图
            for(int i=0;i<vertex;i++) {
                for(int j=0;j<vertex;j++) {
                    int w=scn.nextInt();
                    G.get(i).add(new Node(j, w));
                }
            }
            dijstra(start);
            for(int i=0;i<vertex;i++) {
                if(i!=start) {
                    if(form[i].distance!=Integer.MAX_VALUE) {
                        System.out.print(form[i].distance+" ");
                    }else {
                        System.out.print("-1 ");
                    }
                }
            }
            System.out.println();
        }
        static void dijstra(int start) {
            form[start].distance=0;
            pri.offer(form[start]);
            for(int i=0;i<vertex;i++) {
                int u=pri.poll().vertex;
                visit[u]=true;
                for(int j=0;j<G.get(u).size();j++) {
                    int v=G.get(u).get(j).v;
                    int w=G.get(u).get(j).w;
                    if(G.get(u).get(j).w!=0 &&!visit[v] && form[u].distance+w<form[v].distance) {
                        form[v].distance=form[u].distance+w;
                        form[v].number=form[u].number;
                        pri.offer(form[v]);
                    }
                }
            }
        }
    }
    
    • 1

    算法7-15:迪杰斯特拉最短路径算法

    信息

    ID
    984
    时间
    1000ms
    内存
    32MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者