HDU2680(两点间多边,避坑

传送门

注意要点:两点之间可能存在多边,我的模板中除了floyd都是处理不了多边的,但是floyd在这题显然是不够看的,直接超时。处理的办法就是舍弃存边的结构体edge,像floyd一样定义一个d[num][num]来存放两点间的坐车时间,输入时选取两点之间的最小时间即可。对于只有个别站能乘坐的问题,只要设该站到原点的时间为0,最后求目的地到原点的时间即可。

#include<iostream>
#include<algorithm>
#include<queue>
#include<vector> 
using namespace std;
const int inf = 0x3f3f3f3f;
const int num = 1001;

int n, m, s, k;
int dis[num];
int done[num];
int d[num][num];
struct node{
    int id, dist;
    node(int u, int d){id=u;dist=d;}
    bool operator <(const node &a)const
    {    return dist > a.dist;}
};

void dijkstra(){
    priority_queue<node>q;
    q.push(node(0, 0));
    
    while(!q.empty()){
        node u = q.top();
        q.pop();
        
        if(done[u.id])    continue;
        done[u.id] = 1; 
        
       	for(int i=0; i<=n; i++){
       		if(done[i])	continue;
       		if(dis[i] > u.dist + d[u.id][i]){
       			dis[i] = u.dist + d[u.id][i];
       			q.push(node(i, dis[i]));
			}	
		}
    }
}

int main(){
    while(~scanf("%d%d%d", &n, &m, &s)){
        for(int i=0; i<=n; i++){
        	for(int j=0; j<=n; j++)
        		d[i][j] = inf;
            dis[i] = inf;
            done[i] = d[i][i] = 0;
        }
        
        while(m--){
            int a, b, c;
            scanf("%d%d%d", &a, &b, &c);
            d[a][b] = min(d[a][b], c);
        }
        scanf("%d", &k);
        while(k--){
            int a;
            scanf("%d", &a);
        	d[0][a] = 0;
        }
        
        dijkstra();
        
        if(dis[s]<inf)    printf("%d\n", dis[s]);
        else            printf("-1\n");
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值