社区讨论
单源最短路径。代码~
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 条回复,欢迎继续交流。
正在加载回复...