版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_26760433/article/details/84486618
这题直接用Dijkstra算法就行了,没什么难度。要注意T是路径数,N是顶点数,别弄反了。可能会有重边的情况不过,不过我用的邻接表,没什么影响。
代码
//Menory 412k Time 110ms
#include<vector>
#include<queue>
#include<iostream>
using namespace std;
int T,N;
class road
{
public:
int end;
int weight;
};
class Graph
{
public:
int v;
vector<road> *adj;
int *mark;
Graph(int n);
~Graph();
void addEdge(int s,int e,int w);
};
Graph::Graph(int n)
{
v=n;
adj=new vector<road>[n];
mark=new int[n];
for(int i=0;i<n;i++)
mark[i]=0;
}
Graph::~Graph()
{
delete []mark;
delete []adj;
}
void Graph::addEdge(int s,int e,int w)
{
road r;
r.end=e;
r.weight=w;
adj[s].push_back(r);
r.end=s;
r.weight=w;
adj[e].push_back(r);
}
class Dist
{
public:
int index;
int length;
int pre;
friend bool operator<(const Dist & a,const Dist &b)
{
return a.length>b.length;
}
};
void Dijkstra(Graph & g,int s)
{
Dist *D = new Dist[g.v];
for(int i=0;i<g.v;i++)
{
D[i].index = i;
D[i].length=2147483647;
D[i].pre = s;
}
D[s].length = 0;
priority_queue<Dist> aqueue;
aqueue.push(D[s]);
for(int i=0;i<g.v;i++)
{
Dist d;
bool FOUND;
FOUND=false;
while(!aqueue.empty())
{
d=aqueue.top();
aqueue.pop();
if(g.mark[d.index]==0)
{
FOUND=true;
break;
}
}
if(!FOUND)
break;
g.mark[d.index]=1;
int node=d.index;
vector<road>::iterator ii=g.adj[node].begin();
for(;ii!=g.adj[node].end();ii++)
{
if( D[ii->end].length> D[node].length + ii->weight)
{
D[ii->end].length = D[node].length + ii->weight;
D[ii->end].pre=node;
aqueue.push(D[ii->end]);
}
}
}
cout<<D[0].length<<endl; //输出结果
}
int main()
{
int a1,a2,a3;
cin>>T>>N;
Graph g(5000);
for(int i=1;i<=T;i++)
{
cin>>a1>>a2>>a3;
g.addEdge(a1-1,a2-1,a3); //题目是从1开始,顶点减一从0开始
}
Dijkstra(g,N-1);
}