POJ 1603 Risk 最短路 Floyd Dijstra

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值