直接建图dij遍历就行 注意测试数据路径cost不是在100以内的 无穷值需要设的大一些
(inf = pow(x,y)在代码提交后会编译错误…用10000007代替了)
Sample Input
5 5
1 2 20
2 3 30
3 4 20
4 5 20
1 5 100
Sample Output
90
代码
#include <stdio.h>
#include <cmath>
#include <iostream>
#include <vector>
using namespace std;
int maximumnum = 10000007;
struct Node{
int end;
int cost;
Node(int e,int c){end = e;cost = c;}
};
int main()
{
int T,N;
scanf("%d %d",&T,&N);
vector<vector<Node> > edges(N+1,vector<Node>());
vector<int> distance(N+1,maximumnum);
vector<bool> visited(N+1,false);
int s,e,v;
for(int i=0;i<T;i++)
{
cin >> s >> e >> v;
Node tmp1(e,v);
Node tmp2(s,v);
edges[s].push_back(tmp1);
edges[e].push_back(tmp2);
}
int currNode = N;
distance[N]=0;
for(int i=1;i<N;i++)
{
visited[currNode] = true;
for(int j=0;j<edges[currNode].size();j++)
{
if(distance[edges[currNode][j].end]>distance[currNode]+edges[currNode][j].cost)
{
distance[edges[currNode][j].end]=distance[currNode]+edges[currNode][j].cost;
}
}
int tempnew;
int tempnewdis = maximumnum;
for(int j=1;j<N;j++)
{
if(visited[j])
continue;
if(distance[j]==maximumnum)
continue;
if(distance[j]<tempnewdis)
{
tempnewdis = distance[j];
tempnew = j;
}
}
currNode = tempnew;
}
cout << distance[1];
return 0;
}