D - joisino's travel(最短路+排序)

Problem Statement
There are N towns in the State of Atcoder, connected by M bidirectional roads.

The i-th road connects Town Ai and Bi and has a length of Ci.

Joisino is visiting R towns in the state, r1,r2,..,rR (not necessarily in this order).

She will fly to the first town she visits, and fly back from the last town she visits, but for the rest of the trip she will have to travel by road.

If she visits the towns in the order that minimizes the distance traveled by road, what will that distance be?

Constraints
2≤N≤200
1≤M≤N×(N−1)⁄2
2≤R≤min(8,N) (min(8,N) is the smaller of 8 and N.)
ri≠rj(i≠j)
1≤Ai,Bi≤N,Ai≠Bi
(Ai,Bi)≠(Aj,Bj),(Ai,Bi)≠(Bj,Aj)(i≠j)
1≤Ci≤100000
Every town can be reached from every town by road.
All input values are integers.
Input
Input is given from Standard Input in the following format:

N M R
r1 … rR
A1 B1 C1
:
AM BM CM
Output
Print the distance traveled by road if Joisino visits the towns in the order that minimizes it.

Sample Input 1
Copy
3 3 3
1 2 3
1 2 1
2 3 1
3 1 4
Sample Output 1
Copy
2
For example, if she visits the towns in the order of 1, 2, 3, the distance traveled will be 2, which is the minimum possible.

Sample Input 2
Copy
3 3 2
1 3
2 3 2
1 3 6
1 2 2
Sample Output 2
Copy
4
The shortest distance between Towns 1 and 3 is 4. Thus, whether she visits Town 1 or 3 first, the distance traveled will be 4.

Sample Input 3
Copy
4 6 3
2 3 4
1 2 4
2 3 3
4 3 1
1 4 1
4 2 2
3 1 6
Sample Output 3
Copy
3
这道题基本都是模板,就最后排序比赛的时候一直没想起来。
题意就是给一个带权无向图,然后给出一个人的路线,经过的点的顺序不固定,求出走的最短距离。
先用Floyd求出任意i到j的最短路长度,然后用next_permutation枚举经过的点的顺序即可。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define inf 0x3f3f3f3f

using namespace std;

int paths[210][210];
int R[210];
int n,m,r;

void floyd()
{
    for(int k=1;k<=n;k++)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
               paths[i][j]=min(paths[i][k]+paths[k][j],paths[i][j]);//更新i到j的最短距离
            }
        }
    }
}

int main()
{
    while(scanf("%d%d%d",&n,&m,&r)==3)
    {
        for(int i=0;i<=n;i++)
        {
            for(int j=0;j<=n;j++)
            {
                if(i==j)paths[i][j]=0;
                else paths[i][j]=inf;
            }
        }
        for(int i=0;i<r;i++)
        {
            scanf("%d",&R[i]);
        }
        int a,b,c;
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            if(paths[a][b]>c||paths[b][a]>c)
            {
                paths[a][b]=paths[b][a]=c;
            }
        }
        floyd();
        sort(R,R+r);
        int ans=inf;
        do
        {
            int sum=0;
            for(int i=0;i<r-1;i++)
            {
                sum+=paths[R[i]][R[i+1]];//计算总路程
            }
            ans=min(ans,sum);//更新最短总路程
        }while(next_permutation(R,R+r));//枚举经过的点的顺序
        printf("%d\n",ans);
    }
    return 0;
}
<think>好的,用户现在遇到了一个SQL查询错误,错误代码是1054,提示“Unknown column 'COLUMN_EXTRA' in 'field list'”。他们想查询的是admins表的数据结构,但查询语句中的某个列名可能有问题。让我仔细看看用户的查询语句和表结构。 首先,用户提供的SQL查询是从INFORMATION_SCHEMA.COLUMNS中选择多个列,包括COLUMN_EXTRA。但错误提示指出这个列不存在。我需要确认INFORMATION_SCHEMA.COLUMNS中是否有COLUMN_EXTRA这个列。根据之前的知识,正确的列名应该是EXTRA,而不是COLUMN_EXTRA。所以这里可能是用户写错了列名,导致数据库无法识别。 接下来,用户还提供了admins表的结构,其中有一个Extra列,对应的是附加属性,比如auto_increment和DEFAULT_GENERATED。这说明在查询时应该使用EXTRA而不是COLUMN_EXTRA。因此,修改查询中的列名为EXTRA应该能解决问题。 另外,用户可能对INFORMATION_SCHEMA的结构不太熟悉,可能需要进一步解释各个列的含义,特别是之前提到的KEY和EXTRA。例如,在之前的对话中,用户询问过KEY和EXTRA的含义,现在他们可能是在尝试自己编写查询来获取表结构信息,但遇到了列名错误的问题。 还需要检查用户查询中的其他列是否存在拼写错误。比如,COLUMN_KEY是否正确,或者是否有其他列名拼写错误。根据提供的表结构,用户可能希望获取每个字段的详细信息,包括是否允许为空、默认值、索引类型和附加属性等。 此外,用户提供的admins表结构显示,id字段是主键且自增,username是唯一索引,created_at有默认值生成,role有默认值'admin'。这些信息在查询结果中应该能正确显示,只要列名正确。 总结下来,用户的主要问题在于列名拼写错误,将EXTRA错误地写成了COLUMN_EXTRA。修改这个列名即可解决错误。同时,可能需要提醒用户确保其他列名的正确性,并确认数据库和表名是否正确替换。此外,可能需要指导用户如何正确使用INFORMATION_SCHEMA来获取表结构信息,避免类似的错误。</think>你遇到的错误是因为 `INFORMATION_SCHEMA.COLUMNS` 表中不存在 `COLUMN_EXTRA` 这个字段。正确的字段名称是 `EXTRA`,而非 `COLUMN_EXTRA`。以下是修复后的 SQL 及完整解释: --- ### **修复后的 SQL 语句** ```sql SELECT COLUMN_NAME 列名, COLUMN_TYPE 数据类型, COLUMN_KEY 索引类型, IS_NULLABLE 是否允许为空, DATA_TYPE 字段类型, CHARACTER_MAXIMUM_LENGTH 字段长度, COLUMN_DEFAULT 默认值, EXTRA 附加属性 -- ✅ 修改为 EXTRA 即可 FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = 'travel_guide' -- 替换为你的数据库名 AND table_name = 'admins'; -- 替换为你的表名 ``` --- ### **各字段含义对照表** 根据你提供的 `admins` 表结构,结果将如下所示: | 列名 | 数据类型 | 索引类型 | 是否允许为空 | 字段类型 | 字段长度 | 默认值 | 附加属性 | |-------------|----------------|----------|--------------|----------|----------|-------------------|-----------------------| | id | int | PRI | NO | int | NULL | NULL | auto_increment | | username | varchar(50) | UNI | NO | varchar | 50 | NULL | | | password | varchar(255) | | NO | varchar | 255 | NULL | | | created_at | timestamp | | YES | timestamp| NULL | CURRENT_TIMESTAMP | DEFAULT_GENERATED | | role | varchar(50) | | YES | varchar | 50 | admin | | --- ### **关键字段详解** #### **1. `COLUMN_KEY`(索引类型)** - **`PRI`**:主键(如 `id`),唯一且非空。 - **`UNI`**:唯一索引(如 `username`),值唯一但允许空。 - **空值**:表示无索引(如 `password`, `role`)。 #### **2. `EXTRA`(附加属性)** - **`auto_increment`**:仅用于主键 `id`,插入时自动生成递增值。 - **`DEFAULT_GENERATED`**:用于 `created_at`,表示默认值由数据库生成(`CURRENT_TIMESTAMP`)。 - **空值**:表示无附加属性。 --- ### **常见问题排查** #### **1. 为什么 `role` 的默认值是 `admin`?** - 这是显式设置的默认值,插入记录时若未指定 `role`,系统会自动填充 `admin`。 #### **2. `username` 的 `UNI` 索引有什么作用?** - 确保用户名唯一,避免重复注册。尝试插入重复用户名时会报错。 #### **3. `created_at` 如何自动记录时间?** - 依赖 `DEFAULT_GENERATED` 属性,插入记录时若未指定时间,数据库会自动填充当前时间戳。 --- ### **操作建议** 1. **直接查看表结构**: ```sql DESCRIBE admins; -- 快速查看表结构(无需写复杂查询) ``` 2. **索引优化**: - 若需按 `role` 字段频繁筛选数据,可添加普通索引: ```sql ALTER TABLE admins ADD INDEX (role); ``` 3. **默认值注意事项**: - 若插入数据时跳过有默认值的字段(如 `role`),数据库会自动填充默认值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值