算法笔记P384.甲级1018.
void dijkstra(int s){
int i,newp=s;
mark[s]=1;
dis[s]=0;
while(1){
for(i=0;i<=n;i++){
if(mark[i]==0&&dismap[newp][i]<inf){
if(dis[i]>dis[newp]+dismap[newp][i]){
pre[i].clear();
pre[i].push_back(newp);
dis[i]=dis[newp]+dismap[newp][i];
}
else if(dis[i]==dis[newp]+dismap[newp][i]){
pre[i].push_back(newp);
}
}
}
int min=inf;
for(i=0;i<=n;i++){
if(mark[i]==0&&dis[i]<inf){
if(dis[i]<min){
min=dis[i];
newp=i;
}
}
}
mark[newp]=1;
if(min==inf||newp==sp){
break;
}
}
}
int optvalue;
vector<int>pre[max];
vector<int>path,temppath;
void dfs(int s){
if(s==start){
temppath.push_back(s);
int value;
计算路径temppath上的value值;
if(value优于optvalue){
optvalue=value;
path=temppath;
}
temppath.pop_back();
return;
}
temppath.push_back(s);
int i;
for(i=0;i<pre[v].size();i++){
dfs(pre[v][i]);
}
temppath.pop_back();
}
//边权之和
int value =0,i;
for(i=temppath.size()-1;i>0;i--){//i>0
int now=temppath[i];
int next=temppath[i-1];
value=value+v[now][next];
}
//点权之和
int value =0,i;
for(i=temppath.size()-1;i>=0;i--){//i>=0
int now=temppath[i];
value=value+w[now];
}