原题:http://poj.org/problem?id=2387
题意:有T条路,n个点;给出每条路的花费,问从n 到 1的最小花费;
注意:1、无向图;2、有重边;3、输入T n,边在前,点在后;
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#define inf 1e9
using namespace std;
const int maxn = 1100;
int T, n;
bool vis[maxn];
int cost[maxn][maxn], dis[maxn];
void Dijkstra()
{
for(int i = 1;i<=n;i++)
dis[i] = cost[i][1];
for(int i = 1;i<=n;i++)
{
int k = -1;
int minn = inf;
for(int j = 1;j<=n;j++)
{
if(!vis[j] && minn > dis[j])
{
k = j;
minn = dis[j];
}
}
if(k == -1) break;
vis[k] = true;
for(int j = 1;j<=n;j++)
{
if(!vis[j] && dis[j] > dis[k] + cost[k][j])
{
dis[j] = dis[k] + cost[k][j];
}
}
}
}
int main()
{
while(~scanf("%d%d", &T, &n))
{
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=n;j++)
{
if(i == j) cost[i][j] = 0;
else cost[i][j] = inf;
}
}
while(T--)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
cost[u][v] = cost[v][u] = min(cost[u][v], w);
}
memset(vis, false, sizeof vis);
Dijkstra();
printf("%d\n", dis[n]);
}
return 0;
}