您的位置:首页 > 其它

【spfa】 hdu 2680

2014-04-05 00:03 99 查看
http://acm.hdu.edu.cn/showproblem.php?pid=2680

输入:n, m, s 

代表n个点,m个边,s为终点。

输入m行,  单向边,u,v,w

再输入z

输入z个数,z个起点。

求最短路。

思路。

构造边的时候要反向构造,然后把s当做起点。。。#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn= 1010;
const int maxm= 20020;
const int INF = 0x3f3f3f3f;
bool inqueue[maxn];
int dis[maxn];
int node[maxn];
int top;
struct Side
{
int to,next,w;
}side[maxm];
void add_side(int u,int v,int w)
{
side[top]=(Side){v,node[u],w};
node[u]=top++;
}
int n,m,s,z;
void spfa()
{
memset(dis,0x3f,sizeof(dis));
memset(inqueue,false,sizeof(inqueue));
dis[s]=0;
queue <int> q;
q.push(s);
while(!q.empty())
{
int u=q.front(); q.pop();
inqueue[u]=false;
for(int i=node[u];i!=-1;i=side[i].next)
{
int v=side[i].to;
if(dis[v]>dis[u]+side[i].w)
{
dis[v]=dis[u]+side[i].w;
if(!inqueue[v])
{
q.push(v);
inqueue[v]=true;
}
}
}
}
int ans=INF;
cin>>z;
for(int i=0;i<z;i++)
{
int temp;
scanf("%d",&temp);
ans=min(ans,dis[temp]);
}
if(ans==INF) ans=-1;
cout<<ans<<endl;
}
int main()
{
//freopen("input.txt","r",stdin);
while(~scanf("%d%d%d",&n,&m,&s))
{
memset(node,-1,sizeof(node));
top=0;
for(int i=1;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
//add_side(u,v,w);
add_side(v,u,w);
}
spfa();
}
return 0;
}


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