社区讨论

单源最短路径。代码~

P1078[NOIP 2012 普及组] 文化之旅(疑似错题)参与者 7已保存回复 8

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
8 条
当前快照
1 份
快照标识符
@mi6gg76v
此快照首次捕获于
2025/11/20 04:28
4 个月前
此快照最后确认于
2025/11/20 04:28
4 个月前
查看原帖
CPP
#include<iostream>
using namespace std;
#define MAX 99999999
int main(){
    int e[105][105],n,k,m,s,t;
    int cul[105];//cul[n]:第n个国家的文化 
    int culc[105][105];//文化间的排斥关系 
    cin>>n>>k>>m>>s>>t;
    for(int i=1;i<=n;i++){
        cin>>cul[i];
    }
    for(int i=1;i<=k;i++)
        for(int j=1;j<=k;j++){
            cin>>culc[i][j];
        }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
            e[i][j]=MAX;
            if(i==j) e[i][j]=0;
        }
    for(int i=1;i<=m;i++){
        int x,y,v;
        cin>>x>>y>>v;
        e[x][y]=e[y][x]=v;
    }
    //初始化dis(起点到其它点 ) 
    int dis[105]={0};
    for(int i=1;i<=n;i++)
        dis[i]=e[s][i];
    int book[105]={0};//book:哪些点已经被走过 
    book[s]=1;//起点s被走过了
    for(int k=1;k<=n-2;k++){
        int min=MAX,minpos=-1;
        for(int i=1;i<=n;i++)
            //打擂台 
            if(book[i]==0&&dis[i]!=0&&dis[i]!=MAX&&dis[i]<min){
                min=dis[i];
                minpos=i;
            }
            //更新dis数组
            if(minpos!=-1){
                book[minpos]=1;
                for(int i=1;i<=n;i++){
                    if(book[i]==0&&e[minpos][i]>0&&dis[minpos]+e[minpos][i]<dis[i]&&culc[cul[i]][cul[minpos]]==0)
                        dis[i]=dis[minpos]+e[minpos][i];
                }
            } 
    } 
    if(dis[t]==MAX) cout<<-1;
    else cout<<dis[t];
    return 0;
}

回复

8 条回复,欢迎继续交流。

正在加载回复...