//
// main.cpp
// PAT_1003. Emergency
//
// Created by wjq on 17/3/29.
// Copyright © 2017年 wjq. All rights reserved.
//
#include <iostream>
#include <queue>
#include <string.h>
using namespacestd;
#define inf 999999
int weight[505];
int G[505][505],mindist,maxweight,mindistNum;
bool vis[505];
int nodeNum,edgeNum,C1,C2;
void dfs(int dist,int wei,int st)
{
if(st==C2)
{
if(dist<mindist)
{
mindistNum=1;
mindist=dist;
maxweight=wei;
}
elseif(dist==mindist)
{
mindistNum++;
if(wei>maxweight)
maxweight=wei;
}
return;
}
if(mindist<dist) //如果现在要找的这条路已经比找出来的路长了,那么这条路不继续深搜
return;
for(int i=0;i<nodeNum;i++) //把每一个相邻节点作为目标节点
{
if(vis[i]==false&&G[st][i]!=inf) //如果没有搜过,且要搜的这个点可达
{
vis[i]=true;
dfs(dist+G[st][i],wei+weight[i],i);
vis[i]=false;
}
}
}
int main()
{
for(int i=0;i<505;i++)
{
for(int j=0;j<505;j++)
G[i][j]=555;
}
memset(vis,false,sizeof(vis));
mindist =inf;
maxweight=mindistNum=0;
int a,b,c;
cin>>nodeNum>>edgeNum>>C1>>C2;
for(int i=0;i<nodeNum;i++)
cin>>weight[i];
for(int i=0;i<edgeNum;i++)
{
cin>>a>>b>>c;
G[a][b]=G[b][a]=c;
}
dfs(0,weight[C1],C1);
cout<<mindistNum<<" "<<maxweight<<endl;
}
深搜一下就可以过了,然而刚开始却卡了很久- -
一直以为memset()可以赋任意的值,一开始用memset(G,inf,sizeof(inf));并不能达到我想要的赋值效果
查阅资料后发现:
memset函数按字节对内存块进行初始化,所以不能用它将int数组初始化为0和-1之外的其他值(除非该值高字节和低字节相同)
做实验:
#include <iostream>
#include <string.h>
using namespacestd;
int main(int argc,const char * argv[])
{
int a[100];
memset(a,3,sizeof(a));
cout<<a[0]<<" "<<a[1]<<endl;
}
输出为:
50529027 50529027
可以看到,memset确实只能赋-1或者0的.
此外,memset只能对连续的内存空间赋值,这题中G[505][505]显然是连续的,但如果用的malloc函数来分配内存的时候需要注意:
两次用malloc函数在堆上分的内存可能会不连续,因此用memset就会出错.