地铁环线 时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte 总提交 : 141 测试通过 : 41 描述 一条地铁环线有n个站。我们知道所有相邻站之间的距离: d1是第一个站与第二个站之间的距离; d2是第二个站与第三个站之间的距离; …… dn-1是第n-1个站与第n个站之间的距离; dn是第n个站与第一个站之间的距离; 地铁沿着环线双向行驶,求两个站s与t之间的最短距离。 输入 输入数据包含多组测试用例。 每组测试用例第一行包含一个整数n (3≤n≤100)——地铁环线的站数。第二行包含n个整数d1, d2, ...,dn (1≤di≤100)——相邻站点的距离。第三行包含两个整数s和t(1≤s,t≤n),求第s站和第t站之间的最短距离(s和t可能相等)。 输出 输出第s站与第t站之间的最短距离。 样例输入 4 2 3 4 9 1 3 样例输出 5 #include <iostream> #define MAXN 101 #define INF 0x3fffffff using namespace std; int mat[MAXN][MAXN]; int n;//n为结点数 int dijkstra (int s,int f) { //s为起点, f:为终点 int dis[MAXN];//记录到任意点的最短距离 int mark[MAXN];//记录被选中的结点 int i, j, k; for(i = 1; i <= n; i++) { mark[i] = 0;//初始化所有结点,每个结点都没有被选中 dis[i] = mat[s][i]; } mark[s] = 1;//start结点被选中 dis[s] = 0;//将start结点的的距离设置为0 int min;//设置最短的距离。 for(i=1;i<=n;i++){ k = 1;//赋初值很重要 min = INF; for(j = 1; j <= n;j++) { if(mark[j] == 0 && dis[j] < min)//未被选中的结点中,距离最短的被选中 { min = dis[j] ; k = j; } } mark[k] = 1;//标记为被选中 for(j = 1; j <= n; j++) { if(!mark[j] && dis[j]>dis[k]+mat[k][j])//修改剩余结点的最短距离 { dis[j] = dis[k] + mat[k][j]; } } } return dis[f]; } void init() { for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { if(i == j) mat[i][j] = 0; else mat[i][j] = INF; } } } int main() { int i; int a[101]; cin>>n; init(); for(i=1;i<n;i++) { cin>>a[i]; mat[i][i+1]=mat[i+1][i]=a[i]; } cin>>a[i]; mat[i][1]=mat[1][i]=a[i]; int s, e; cin>>s>>e; int ans = dijkstra(s, e); cout<<ans<<endl; }