贝茜在外地,想要回到谷仓,让农民约翰在早上挤奶的时候唤醒她。贝西需要美丽的睡眠,所以她想尽快回去。
农夫约翰的田地有N(2 <= N <= 1000)地标,唯一编号1..N。地标1是谷仓;贝西整天站在树上的苹果树林是标志性的。奶牛在地标之间使用T(1 <= T <= 2000)个不同长度的双向牛蹄行走。贝茜对自己的导航能力没有信心,所以一旦开始,贝茜就始终保持着从头到尾的踪迹。
鉴于地标之间的路径,确定贝西必须走回谷仓的最小距离。保证有一些这样的路线存在。
输入
*第1行:两个整数:T和N.
*第2行到第(1)行:每行将一个轨迹描述为三个空格分隔的整数。前两个整数是路线之间的地标。第三个整数是路径的长度,范围是1..100。
产量
*第1行:单个整数,贝西必须从地标N到地标1获取的最小距离。
5 5 1 2 20 2 3 30 3 4 20 4 5 20 1 5 100
90读题读题啊,先输入t后输n,眼瞎的我wa了十几发终于发现了...
而且要判重,剩下的就是简单的Dijkstra算法了-,-
代码
#include <iostream>
#include <cstring>
using namespace std;
const int inf = 0x3f3f3f3f;
int n,t;
int vis[1010],dis[1010];
int mp[1010][1010];
int u,v;
void init()
{
for(int i = 1;i<=n;i++)
for(int j = 1;j<=n;j++)
if(i == j)
mp[i][j] = 0;
else
mp[i][j] = inf;
}
void input()
{
int a,b,c;
for(int i = 0;i<t;i++)
{
cin >> a >> b >> c;
if(c < mp[a][b])
{
mp[a][b] = c;
mp[b][a] = c;
}
}
}
void Dijkstra()
{
for(int i = 1;i<=n;i++)
{
vis[i] = 0;
dis[i] = mp[n][i];
}
int _min;
for(int i = 1;i<=n-1;i++)
{
_min = inf;
for(int j = 1;j<=n;j++)
{
if(vis[j] == 0 && dis[j] < _min)
{
_min = dis[j];
u = j;
}
}
vis[u] = 1;
for(v = 1;v<=n;v++)
{
if(vis[v] == 0 && dis[v] > dis[u] + mp[u][v])
dis[v] = dis[u] + mp[u][v];
}
}
}
int main()
{
cin >> t >> n;
init();
input();
Dijkstra();
cout<<dis[1]<<endl;
}