POJ 1603 Risk 最短路 Floyd Dijstra

来源:互联网 发布:云图tv电视直播mac版 编辑:程序博客网 时间:2024/06/04 18:08
POJ 1603
每组数据先输入19组边信息,依次代表从第几个顶点出发有哪些边与之直接相连。
要注意的是图是无向图,所以在更改邻接矩阵时根据无向图的对称性来处理数据

就是求两点中间的最少的城市个数

public class Main{ static int[][] w=new int[21][21]; static final int n=20; public static void main(String[] args) {   Scanner in=new Scanner(System.in);   int cnt=0;   while(in.hasNext())   {cnt++;for(int i=0;i< n;i++)for(int j=0;j< n;j++)w[i][j]=9999999;for(int i=0;i< n-1;i++){int u=in.nextInt();for(int j=0;j< u;j++){int v=in.nextInt();w[i][v-1]=w[v-1][i]=1;}}for(int k=0;k< n;k++)for(int i=0;i< n;i++)for(int j=0;j< n;j++)w[i][j]=Math.min(w[i][j], w[i][k]+w[k][j]);int c=in.nextInt();System.out.println("Test Set #"+cnt);while((c--)!=0){int a1=in.nextInt();int a2=in.nextInt();System.out.println(a1+" to "+a2+": "+w[a1-1][a2-1]);}System.out.println();  } }}
Dijstra

#include<iostream>  #include<cstdio>  #include<cstring>  #define MAXNODE 25  #define MAXCOST 9999  using namespace std;  int main()  {      void InputCost(int Cost[][MAXNODE]);      void Dijkstra(int Cost[][MAXNODE],int f,int Distance[],int e);      int Cost[MAXNODE][MAXNODE];      int cnt;      int kkk = 0; /*kkk为格式控制中的数据编号*/      int n,k;      int i,f,e,Distance[MAXNODE];      while(cin>>n) /*格式控制*/ /*题目已说明总共19组数据,先在input函数外输入一组用于方便格式控制*/     {          memset(Cost,0x3f,sizeof(Cost));          while(n--)          {              cin>>k;              Cost[1][k] = 1;              Cost[k][1] = 1;          }          InputCost(Cost);          cin>>cnt; /*输入查找的信息 */          ++kkk;          printf("Test Set #%d\n",kkk);          while(cnt--)          {              cin>>f>>e;              Dijkstra(Cost,f,Distance,e);          }          putchar(10);     }      return 0;  }  void InputCost(int Cost[][MAXNODE]) /*数据输入,用邻接矩阵来存储图的信息*/  {      int n,k;        for(int i = 2 ; i <= 19 ; i++)      {          scanf("%d",&n);          for(int j = 0 ; j < n ; j++)          {              scanf("%d",&k);              Cost[i][k] = 1;              Cost[k][i] = 1;          }      }  }  void Dijkstra(int Cost[][MAXNODE],int f,int Distance[],int e)/*f为出发的结点,e为要查找的从f出发到e的顶点*/  {      int s[MAXNODE];      int mindis,dis;      int i,j,u;      for(i=1;i<=20;i++)   /*对S数组初始化*/      {          Distance[i]=Cost[f][i];          s[i]=0;      }      s[f]=1;   /*标记v0.*/      for(i=1;i<=20;i++)      {          mindis=MAXCOST;          for(j=1;j<=20;j++)          {              if(s[j]==0 && Distance[j]<mindis)  /*每一次循环比较得到最短值。*/              {                  u=j;                  mindis=Distance[j];              }          }          s[u]=1;   /*标记u.*/          for(j=1;j<=20;j++)          {              if(s[j]==0)              {                  dis=Distance[u]+Cost[u][j];                  Distance[j]=(Distance[j]<dis)?Distance[j]: dis;   /*修改从初始结点到其他顶点的最短距离。*/              }          }      }      printf("%d to %d: %d\n",f,e,Distance[e]);  }  




0 0
原创粉丝点击