2010Asia Harbin Regional Contest----Seaside(HDU3665)

就是个简单的图论,用dijsktra、floyd、bellman都行,求出由0到其他点得到最短距离后,在扫一遍看其他点是否靠海,再求出这些靠海点的最短路即可,貌似此题测试数据不太完善:就是一条路可以有两个不同的权值,其实这也无关紧要,只需稍加改动而已#include<stdio.h> #include<string.h> #define oo 999999 int n,m,p,s,l; int map[20][20],sea[20]; int main() { while(scanf("%d",&n)!=EOF){ for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(i!=j) map[i][j]=oo; for(int i=0;i<n;i++){ scanf("%d%d",&m,sea+i); while(m--){ scanf("%d%d",&s,&l); map[i][s]=l; } } for(int k=0;k<n;k++)//求最短路 for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(map[i][k]!=oo&&map[k][j]!=oo&&map[i][j]>map[i][k]+map[k][j]) map[i][j]=map[i][k]+map[k][j]; int min=oo; //求最短路后扫描一下 for(int i=0;i<n;i++){ if(min>map[0][i]&&sea[i]) min=map[0][i]; } printf("%d/n",min); } return 0; } 

你可能感兴趣的:(2010Asia Harbin Regional Contest----Seaside(HDU3665))