题目链接:畅通工程续
题意:点击上面的链接自行查看
单源点最短路径,使用spfa。
#include <bits/stdc++.h> //有的oj中选择c++编译失败,可以考虑换头文件或者选择G++试一下
#include<cstring>
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define fori(a,b,c) for(int a=b;a<=c;a++)
#define ford(a,b,c) for(int a=c;a>=b;a--)
#define mem0(x) memset(x,0,sizeof(x))
#define mem1(x) memset(x,-1,sizeof(x))
using namespace std;
const int M=210,inf=1e8;
struct N
{
int p,v;
};
vector<N> g[M];
int d[M],n,m;
int spfa(int s,int t)
{
fill(d,d+n,inf);
queue<int> q;
q.push(s);
d[s]=0;
while(!q.empty())
{
s=q.front();
q.pop();
for(int i=0; i<g[s].size(); i++)
{
int v=g[s][i].p,c=g[s][i].v;
if(d[v]>d[s]+c)
{
d[v]=d[s]+c;
q.push(v);
}
}
}
return d[t];
}
int main()
{
while(scanf("%d%d",&n,&m)==2)
{
for(int i=0;i<n;i++)if(!g[i].empty())g[i].clear();
int s,t,x;
while(m--)
{
scanf("%d%d%d",&s,&t,&x);
g[s].push_back((N){t,x}); //在航电oj提交的时候要选择G++,选择c++编译不通过,应该是不支持这种结构体这样赋值
g[t].push_back((N){s,x});
}
scanf("%d%d",&s,&t);
int ans=spfa(s,t);
if(ans==inf)printf("-1\n");
else printf("%d\n",ans);
}
return 0;
}