Dijkstra算法虽然可以算单源最短路,如果对边的权值为正的还没问题,但对边权为负的情况就不好办了,Bellman——ford可以很好滴解决这个个问题
,它是对边的松弛。
#include<iostream>
using namespace std;
#define MAXM 10100
int u[MAXM],v[MAXM],w[MAXM],site[MAXM],d[MAXM];
int N,M,P,Q;
void read_graph()
{
int i;
cin>>N>>M>>P>>Q;
for(i=0;i<N;i++)
cin>>site[i];
for(i=1;i<2*P;i+=2)
{
cin>>u[i]>>v[i]>>w[i];
u[i+1]=v[i];
v[i+1]=u[i];
w[i+1]=w[i];
}
//for(i=1;i<2*p)
}
void Bell_Ford()
{
int i,j;
for(i=0;i<=M;i++)d[i]=10000;
d[Q]=0;
for(i=1;i<M;i++)
for(j=1;j<=2*P;j++)
{
if(d[u[j]]<10000&&d[v[j]]>d[u[j]]+w[j])
{
d[v[j]]=d[u[j]]+w[j];
}
}
}
int main()
{
//freopen("Input.txt","r",stdin);
int t;
cin>>t;
while(t--)
{
int min,i;
read_graph();
Bell_Ford();
min=d[site[0]];
for(i=1;i<N;i++)
{
if(i!=Q&&min>d[site[i]])
min=d[site[i]];
}
cout<<min<<endl;
}
}
写得越来越烂