您的位置:首页 > 其它

L3-004. 肿瘤诊断

2016-05-31 18:05 344 查看
[b]L3-004. 肿瘤诊断[/b]

题目链接:https://www.patest.cn/contests/gplt/L3-004

BFS

之前尝试使用递归dfs,提交后发现有两个段错误,发现递归层数太多,然后改用bfs解决。

代码如下:

#include<cstdio>
#include<stack>
#define N 505
#define MAX 5000
using namespace std;
int n,m,s,d;
int pro
;
int Map

;
bool mark
;
int sum
;
int path
;
int Distance
;
int person
;
int i,j;
stack<int>st;
int main(void){
freopen("in.txt","r",stdin);
scanf("%d%d%d%d",&n,&m,&s,&d);
for(i=0;i<n;++i)scanf("%d",&pro[i]);
for(i=0;i<n;++i)
for(j=0;j<n;++j)Map[i][j]=MAX;
while(m--){
int len;
scanf("%d%d%d",&i,&j,&len);
if(Map[i][j]>len)Map[i][j]=Map[j][i]=len;
}
for(i=0;i<n;++i){
Distance[i]=MAX;
sum[i]=1;
person[i]=pro[s];
if(Map[s][i]<MAX){
Distance[i]=Map[s][i];
path[i]=s;
person[i]+=pro[i];
}
}
mark[s]=1,Distance[s]=0;
while(1){
int k,m=MAX;
for(i=0;i<n;++i){
if(!mark[i]&&m>Distance[i]){
m=Distance[i];
k=i;
}
}
if(m==MAX)break;
mark[k]=1;
for(i=0;i<n;++i){
if(!mark[i]){
if(Distance[i]>Distance[k]+Map[k][i]){
Distance[i]=Distance[k]+Map[k][i];
person[i]=person[k]+pro[i];
path[i]=k;
sum[i]=sum[k];/**not 1**/
}else if(Distance[i]==Distance[k]+Map[k][i]){
sum[i]+=sum[k];/**not ++**/
if(person[i]<person[k]+pro[i]){
person[i]=person[k]+pro[i];
path[i]=k;
}
}
}
}
}
int temp=pro[d];
int k=d;
while(k!=s){
st.push(k);
k=path[k];
temp+=pro[k];
}
printf("%d %d\n",sum[d],temp);
printf("%d",s);
while(!st.empty()){
printf(" %d",st.top());
st.pop();
}
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: