1624: 最短路
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 279 Solved: 70
[Submit][Status][Web Board]
Description
有n个城市编号为1—n,m条路,告诉你每条路的长度,求给定两点的最短路径长度。
Input
T 组数据
每组数据第一行有两个正整数n,m(n<=1000,m<=10000)分别表示城市的数量和路的条数,接下来m行,每行3个整数a,b,c,表示城市a和城市b之间有一条c长度的路
最后一行输入两个整数x,y。
Output
输出城市 x 到城市 y 的最短路径。如果不存在输出-1。
Sample Input
2
3 2
1 2 2
2 3 3
1 3
4 2
1 2 3
1 3 2
1 4
Sample Output
5
-1
题意很明显,就是求最短路径。模板题,套一下模板就好了。但这题要注意的是它是无向的,之前wa,就是弄成有向了,然后后面增加了一句代码就A了
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
priority_queue<pii,vector<pii>,greater<pii> > q;
const int VN=1000;
int INF=INT_MAX;
struct addEdges{
int v,w,next;
}E[VN*VN];
int n,size,head[VN],d[VN];
void init()
{
size=0;
memset(head,-1,sizeof head);
while(!q.empty()) q.pop();
}
void addEdge(int u,int v,int w)
{
E[size].v=v;E[size].w=w;
E[size].next=head[u];
head[u]=size++;
}
void Dijkstra(int src)
{
for(int i=1;i<=n;i++) d[i]=INF;
d[src]=0;
q.push(make_pair(d[src],src));
while(!q.empty())
{
pii x=q.top(); q.pop();
int u=x.second;
if(d[u]!=x.first) continue;
for(int e=head[u];e!=-1;e=E[e].next)
{
int tmp=d[u]+E[e].w;
if(tmp<d[E[e].v])
d[E[e].v]=tmp;
q.push(make_pair(tmp,E[e].v));
}
}
}
int main(void)
{
int T; scanf("%d",&T);
while(T--)
{
init();
int m;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
addEdge(a,b,c);
addEdge(b,a,c);//之前落掉了,这题是无向的
}
int x,y;
scanf("%d%d",&x,&y);
Dijkstra(x);
if(d[y]!=INF) printf("%d\n",d[y]);
else printf("-1\n");
}
return 0;
}