ccf csp-201712-4-行车路线(Dijkstra算法)

原试题点击此处

  • 注意:距离要用long long,否则部分用例通不过!!!因为连续的小路会出现很多平方!!!

代码如下

#include<iostream>
#include<vector>
#include<stdio.h>
using namespace std;
const int N = 1010;
const long long INF = 1e18;
int n,m;
struct node{
	int vertex;
	int type;
	long long dis;
};
vector<node> v[N];
long long dis[N],trail[N]={0};
bool visit[N];
long long pf(long long n){
	return n * n;
}
void dijkstra(int s){
	dis[s] = 0;
	for(int i = 1; i <= n; i++){
		int index = -1;long long minn = INF;
		for(int j = 1; j <= n; j++){
			if(!visit[j]&&dis[j]<minn){
				minn = dis[j];
				index = j;
			} 
		}
		if(index == -1) break;
		visit[index] = true;
		for(int j = 0; j < v[index].size(); j++){
			int vertex = v[index][j].vertex;
			int type = v[index][j].type;
			if(!visit[vertex]){
				if(type == 1){
					if(dis[index]-pf(trail[index])+pf(trail[index]+v[index][j].dis)<dis[vertex]){
						dis[vertex] = dis[index]-pf(trail[index])+pf(trail[index]+v[index][j].dis);
						trail[vertex] = trail[index]+v[index][j].dis;
					}
				}else{
					if(dis[index]+v[index][j].dis < dis[vertex]){
						dis[vertex] = dis[index]+v[index][j].dis;
						trail[vertex] = 0;
					}
				}
			}
		}
	} 
}
int main()
{
	int t,a,b;
	long long c;
	fill(dis, dis+N, INF);
	fill(visit, visit+N, false);
	scanf("%d%d", &n, &m);
	for(int i = 0; i < m; i++){
		scanf("%d%d%d%lld", &t, &a, &b, &c);
		v[a].push_back({b,t,c});
		v[b].push_back({a,t,c});
	}
	dijkstra(1);
	printf("%d\n", dis[n]);
	return 0;
}
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值