错误百出调试多次的代码
#include<queue>
#include<map>
#include<string>
#include<iostream>
#define INF 1e17
#define maxn 100010
using namespace std;
//堆优化+vector<Edge>
//类
struct qnode{//堆结点
int v;//顶点编号
long long dis;//顶点到起点的距离
qnode(int v,long long d):v(v),dis(d){
} ;
qnode(){
};
friend bool operator < (qnode a,qnode b){//默认<,最大堆
return a.dis>b.dis;//最小堆
}
};
struct Edge{
//从某个顶点出发到达点v花费c
int v;
long long c;
Edge(int v,long long c):v(v),c(c){
};
};
class Graph{
public:
vector<Edge> E[maxn];//图,邻接表
bool vis[maxn];
long long dis[maxn];
int path[maxn];
int n;
int sc,di;
public:
void addEdge(int u,int v,long long w){
E[u].push_back(Edge(v,w));
}
void read(){
int m;
cin>>n>>m;
int u,v;
long long w;
for(int i=0;i<m;i++){
cin>>u>>v>>w;
addEdge(u,v,w);
//双向 addEdge(v,u,w);
}
}
void init2(int start,int end,int nn){
sc=start;
di=end;
n=nn;
}
void dijkstra(){
//init
for(int i=1;i<=n;i++){
dis[i]=INF;
vis[i]=0;
path[i]=-1;
}
dis[sc]=0;
//
priority_queue<qnode> Q;
Q.push(qnode(sc,0));
//
qnode tmp;
while(!Q.empty()){
//findmin
tmp=Q.top();Q.pop();
int u=tmp.v;
if(vis[u])continue;
vis[u]=true;
//松弛
for(int i=0;i<E[u].size();i++){//点u所有的出边
int v=E[u][i].v;
long long cost=E[u][i].c;
if(!vis[v]&&dis[v]>dis[u]+cost){
dis[v]=dis[u]+cost;
path[v]=u;
//将被松弛过的点加入队列
Q.push(qnode(v,dis[v]));
}
}
}
}
void put(){
for(int i=1;i<=n;i++)cout<<dis[i]<<" ";
cout<<endl;
}
};
//利用map映射城市名得到顶点编号
int temp=1;
map<string,int> mp;
int ID(string s)
{
if(mp.find(s)==mp.end())
mp[s]=temp++;
return mp[s];
}
//边节点
struct enode{
int u,v;
long long w;
enode(int u,int v,int w):u(u),v(v),w(w){
};
enode(){
};
};
vector<enode> Ed;//存储边的数组
Graph G1,G2;
int main(){
int n,m;
string s,ss;
long long weight;
int u,v;
while(cin>>n>>m){
//忘记读nm×n
mp.clear();
temp=1;
Ed.clear();
for(int i=0;i<=n;i++){
G1.E[i].clear();
G2.E[i].clear();
}
//
for(int i=0;i<m;i++){
cin>>s>>ss>>weight;
u=ID(s);
v=ID(ss);
Ed.push_back(enode(u,v,weight));
G1.addEdge(u,v,weight);
G2.addEdge(v,u,weight);//单向路,所以应反向建图
}
//
cin>>s>>ss;
u=ID(s);
v=ID(ss);
G1.init2(u,v,n);//正向
G2.init2(v,u,n);//反向;
//最开始没调用dijkstra函数×2
G1.dijkstra();
G2.dijkstra();
//G1.put();
//G2.put();
long long min=INF;
//cout<<v<<" : "<<G1.dis[v]<<endl;
if(G1.dis[v]>=INF){
cout<<-1<<endl;
//break;导致退出程序,不能多组样例
}else{
enode tmp;
for(int i=0;i<Ed.size();i++){
tmp=Ed[i];
u=tmp.u;
v=tmp.v;
if(G1.dis[u]+G2.dis[v]+tmp.w/2<min){
min=G1.dis[u]+G2.dis[v]+tmp.w/2;
}
}
cout<<min<<endl;
}
}
return 0;
}
不写思路了,贴个链接这里写链接内容