题目大意
这道题要我们求一群奶牛最短的回家的路,题目会给你n个点,m条边,然后给你每条边又哪两个点相连,并且其中的路程是多少。我们需要找到最短路径的总路程。
样例输入
5 5
1 2 20
2 3 30
3 4 20
4 5 20
1 5 100
样例输出
90
分析
坑点1:这边和点是倒着给的 , 你需要先输入边再输入点。
坑点2:他会给你重复的边,比如1和2之间的距离是100,然后又给你说1和2之间的距离是80。当然我们可以理解为1和2之间有两条路,但是我就因为这个wa了好多发。当然,我们构建邻接矩阵的时候需要选择最短的那条路。
剩下的就dijkstra一波带走。代码如下。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define CLR(x) memset(x,0,sizeof(x))
using namespace std;
const int INF = 100000;
const int maxp = 1100;
const int maxl = 1000000;
int edge[maxp][maxp];
int dist[maxp];
int vis[maxp];
int p,l;
int dijkstra(int x) //磁少风格版
{
for(int i = 1 ; i <= p ; i++)
dist[i] = INF;
int v = x;
dist[v]=0;
vis[v]=1;
for(int i = 1 ; i <= p ; i++)
{
for(int j = 1; j <= p ; j++)
{
if(vis[j]!=1 && dist[v]+edge[v][j] < dist[j])
{
dist[j] = dist[v] + edge[v][j];
}
}
int minn = INF;
for(int j = 1 ; j <= p ; j++)
if(vis[j]!=1 && dist[j] < minn)
{
minn=dist[j];
v=j;
}
vis[v]=1;
}
}
int main()
{
while(scanf("%d%d",&l,&p)!= EOF)
{
for(int i = 0 ; i < maxp ; i++)
{
for(int j = 0 ; j < maxp ; j++)
{
edge[i][j] = INF;
}
edge[i][i] = 0;// 因为可能输入重复两条边的值我们需要选出同样的边最小的那一个值;
}
CLR(vis);
for(int i = 1 ; i <= l ; i++)
{
int u,v,w;
scanf("%d %d %d",&u,&v,&w);
if(edge[u][v] > w)
{
edge[u][v] = edge[v][u] = w;
}
}
dijkstra(1);
printf("%d\n",dist[p]);
}
}