//感谢jianshen
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <queue>
#include <cstring>
#include <utility>
#define MAXN 2510
#define MAXM 6210
using namespace std;
int n,m,s,t;
typedef pair<int ,int> PII;
struct edge {
int v, w;
edge *next;
void add(int y, int z, edge *&head){ v = y; w = z; next = head; head = this; }
}Te[MAXM*2],*Pe=Te,*head[MAXN*2];
void add_edge(int x, int y, int z) {
Pe++->add(y, z, head[x]);
}
int dist[MAXN];
bool visit[MAXN];
void dijkstra(int x) {
priority_queue<PII>q;
while (!q.empty()) q.pop();
memset(dist, 0x3f, sizeof(dist));
memset(visit, 0, sizeof(visit));
dist[x] = 0;
q.push(make_pair(0, x));
while (!q.empty()) {
while (!q.empty() && visit[q.top().second]) q.pop();
if (q.empty()) break;
PII t = q.top(); q.pop();
int i = t.second;
dist[i] = -t.first;
visit[i]=true;
for (edge *p = head[i]; p; p = p->next)
if (!visit[p->v]) q.push(make_pair(-(dist[i] + p->w), p->v));
}
}
void init()
{
memset(head, 0, sizeof(head));
Pe=Te;
for(int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add_edge(x,y,z);
add_edge(y,x,z);
}
scanf("%d%d",&s,&t);
}
int main()
{
while(scanf("%d%d",&n,&m)==2){
init();
if(s==t){cout<<0<<endl;continue;}
dijkstra(s);
cout<<(dist[t]==0x3f3f3f3f?-1:dist[t])<<endl;
}
}
floyd
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int MAXN = 555;
int f[MAXN][MAXN], s, t, n, m;
int main()
{
while (~scanf("%d%d", &n, &m))
{
memset(f, 0x3f, sizeof(f));
int tmp=f[1][1];
for (int i = 1; i <= m; i++)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
++u; ++v;//注意下标位置
//printf("Add %d %d %d\n", u, v, w);
f[u][v] = f[v][u] = min(w, f[u][v]);//邻接矩阵,重边= =
}
scanf("%d%d", &s, &t);
if(s == t) {//特判
cout<<0<<endl;
continue;
}
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (f[i][j] > f[i][k] + f[k][j])
f[i][j] = f[i][k] + f[k][j];
printf("%d\n", f[s + 1][t + 1]==tmp?-1:f[s+1][t+1]);
}
return 0;
}