关于 P1811 最短路
  • 板块学术版
  • 楼主luxiaomao
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/12/1 17:37
  • 上次更新2023/12/1 20:12:33
查看原帖
关于 P1811 最短路
1037502
luxiaomao楼主2023/12/1 17:37

P1811

本人用 map 判三元组 + dijkstra 写,但是 WA #3 求助。。。

#include<bits/stdc++.h>
#define inf 1000000000
using namespace std; 

int n,m,k;
vector<int> mp[3005];
map<tuple<int, int, int>, bool> ok;

int dis[3005],las[3005],ans[3005];
bool vis[3005];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;

void dijkstra()
{
	for(int i = 1;i <= n;i++)dis[i] = inf;
	dis[1] = 0;
	q.push(make_pair(0,1));
	while(!q.empty())
	{
		int u = q.top().second;
		q.pop();
		if(vis[u])continue;
		vis[u] = 1;
		for(int i = 0;i < (int)mp[u].size();i++)
		{
			int v = mp[u][i];
			if(ok[{las[u],u,v}])continue;
			if(dis[u] + 1 < dis[v])
			{
				dis[v] = dis[u] + 1;
				las[v] = u;
				q.push(make_pair(dis[v],v));
			}
		}
	}
	return;
}

int main()
{
	scanf("%d%d%d",&n,&m,&k);
	while(m--)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		mp[u].push_back(v);
		mp[v].push_back(u);
	}
	while(k--)
	{
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		ok[{u,v,w}] = 1;
	}
	dijkstra();
	
	printf("%d\n",dis[n]);
	int now = 1;
	for(int i = n;i;i = las[i])
	{
		ans[now++] = i;
	}
	while(--now)
	{
		printf("%d ",ans[now]);
	}
	return 0;
} 
2023/12/1 17:37
加载中...