这题用矩阵过的,想尝试用一下链式前向星。。。
结果发现一直 RE (什么鬼 -_- ,后来经过师哥指点::要设置一个超级起点; (嘛?啥叫 超级起点? 就是设。。算了,我也是才知道的,不要误导了,还是自行百度吧。。。)
然后 弄完超级起点 后 在弄个超级终点。。。
代码如下
#include<iostream>
#include<queue>
#include<cstdio>
#define INF 0x3f3f3f3f
using namespace std;
int T,S,D,a,cnt,x,b,c,y;
queue<int>q;
struct edge
{
int from;
int to;
int next;
int cost;
} e[3009];
int dis[3100],head[3100];// 无向图 数组至少开两倍。。。
bool vis[3100];
void add(int u,int v,int w)
{
e[cnt].from = u;
e[cnt].to = v;
e[cnt].cost = w;
e[cnt].next = head[u];
head[u] = cnt ++;
}
void init()
{
cnt = 0;
for(int i=0; i<=1009; i++)
{
dis[i] = INF;
head[i] = -1;
vis[i] = 0;
}
}
void SPFA()
{
while(!q.empty())
{
int k =q.front();
q.pop();
vis[k] = 0;
for(int i = head[k]; ~i; i = e[i].next)
{
int v = e[i].to;
if(dis[v] > dis[k] + e[i].cost)
{
dis[v] = dis[k] + e[i].cost;
if(!vis[v])
{
q.push(v);
vis[v] = 1;
}
}
}
}
}
int main()
{
while(scanf("%d%d%d",&T,&S,&D)!=EOF)
{
init();
for(int i=1; i<=T; i++)
{
cin>>a>>b>>c;
add(a,b,c);
add(b,a,c);
}
dis[0] = 0;
for(int i = 1; i<=S; i++)
{
cin>>x;
add(0,x,0);// 超级起点。。。
add(x,0,0);
}
q.push(0);
SPFA();
int minn = 2147483647;
for(int i = 1; i<=D; i++)
{
cin>>y;
if(minn>dis[y])
minn = dis[y];
}
cout<<minn<<endl;
}
return 0;
}
对了,还有。。。使用矩阵时要注意判重。。。判重。。。判重。。。
使用链式前向星时就没必要判重了。。。