关闭

26991: 带负权的单源最短路

336人阅读 评论(0) 收藏 举报
分类:
题目描述

 输入一个有向网络图,边的权值可正可负,求顶点到其他各点的最短路。


输入

第一行输入n,表示n个结点(默认顶点为0号)

接下来输入n*n矩阵。表示各边的权值。


输出

输出一行,如果有负权回路输出“not possible”,否则输出顶点0到其他点的最短路,输出答案之间仅有一个空格,结尾没有空格。


样例输入
4
0 0 -3 0
2 0 0 0
0 -1 0 -4
0 0 0 0

样例输出
not possible

program p26991;
var
 w:array[0..1000,0..1000]of longint;
 dist:array[0..1000]of longint;
 n,x,i,j,k:longint;
 change:boolean;
begin

 readln(n);
 for i:=0 to n-1 do
  for j:=0 to n-1 do
   begin
    read(x);
    if (x=0)and(i<>j)then w[i,j]:=maxint else w[i,j]:=x;
   end;
 for i:=1 to n do
  if w[i,j]=maxint then dist[i]:=maxint else dist[i]:=w[0,i];
  dist[0]:=0;
  for k:=0 to n-1 do
   for j:=0 to n-1 do
    for i:=0 to n-1 do
     if (w[i,j]<>maxint)and(dist[i]<>maxint)and(dist[j]>dist[i]+w[i,j])
     then
      dist[j]:=dist[i]+w[i,j];
 change:=true;

 for i:=0 to n-1 do
  for j:=0 to n-1 do
   if dist[j]>dist[i]+w[i,j]
   then change:=false;
 if not change then
   writeln('not possible')
  else
   for i:=1 to n-2 do
    write(dist[i],' ');
 if change then
    writeln(dist[n-1]);

end.

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:16211次
    • 积分:118
    • 等级:
    • 排名:千里之外
    • 原创:91篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档