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]);
}