您的位置:首页 > 其它

NYOJ 115城市平乱(Dijkstra最短路径)

2013-08-02 14:59 197 查看
#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
#define INF 1<<30
#define Min(x,y) x>y?y:x
using namespace std;
int dist[1003],vis[1003];
int map[1003][1003],city[105];
int N,M,P,Q;
int Dijkstra()
{
int i,j,mark,mindis,min_d;
memset(vis,0,sizeof(vis));
for(i=1; i<=M; i++)dist[i] = INF;//初始化
dist[Q] = 0;    //以目的地作为起点
for(i=1; i<=M; i++){
mark = -1;
mindis = INF;
for(j=1; j<=M; j++)
if( !vis[j] && dist[j] < mindis){
mindis = dist[j];
mark = j;
}
vis[mark] = 1;
for(j=1; j<=M; j++)if( !vis[j] && map[mark][j])
dist[j] = Min(dist[j],dist[mark] + map[mark][j]);
}
min_d = dist[city[1]];
for(i=1; i<=N; i++)
if(dist[city[i]] < min_d)min_d = dist[city[i]];
return min_d;
}
int main()
{
//freopen("in.txt","r",stdin);
int T,i,vi,vj,w;
cin>>T;
while(T--)
{
cin>>N>>M>>P>>Q;
memset(map,0,sizeof(map));
for(i=1; i<=N; i++)cin>>city[i];
for(i=1; i<=P; i++){
cin>>vi>>vj>>w;
if(map[vi][vj])
map[vi][vj] = map[vi][vj]<w?map[vi][vj]:w;
else
map[vi][vj] = map[vj][vi] = w;
}
cout<<Dijkstra()<<endl;
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: