UVA1599

news/2024/12/4 17:12:08/

题目:https://vjudge.net/problem/UVA-1599

思路:先反向做一次bfs,求出各点到终点经过的最少结点数量。然后正向做一次bfs,每次都选取颜色最小的路径,同时要保证距离的值刚好减1,如果有多条路可以走,则要记录这些结点,下一步需要考虑所有从这些点出发的边(这里的循环要注意写)

 

#include<cstdio>
#include<string.h>
#include<queue>
#include<vector>
#include<map>
#include<stack>
#include<set>
#include<algorithm>
#include<map>
#include<math.h>
using namespace std;
#define INF 1<<30
static const int MAX = 200500;int n,m;
vector<int> G[MAX]; //边
vector<int> C[MAX]; //从该点出发的颜色
int visit[MAX];
int length[MAX];    //length[i]表示结点i与终点的距离
int ans[MAX];//从终点往起点bfs,算出各点到点n最短距离
void reverse_bfs()
{memset(visit, 0, sizeof(visit));for (int i = 1; i <= n; i++)length[i] = INF;length[n] = 0;queue<int> Q;Q.push(n);visit[n] = 1;while (!Q.empty()){int v = Q.front();  Q.pop();for (int i = 0; i < G[v].size(); i++){int p = G[v][i];if (length[p] > length[v] + 1)length[p] = length[v] + 1;if (visit[p] == 0){visit[p] = 1;Q.push(p);}}}printf("%d\n", length[1]);
}//从起点往终点bfs,每次都选最小值
void bfs()
{for (int i = 0; i <= n; i++)ans[i] = INF;memset(visit, 0, sizeof(visit));set<int> S;S.insert(1);visit[1] = 1;while (!S.empty()){vector<int> tmp;    //保存选择的结点int color = INF;int d = 0;//这次查找的结点距离终点的距离//选择颜色最小的结点for (set<int>::iterator it = S.begin(); it != S.end(); it++){d = length[*it];for (int i = 0; i < G[*it].size(); i++){if (length[*it] == length[G[*it][i]] + 1 && color > C[*it][i]){color = C[*it][i];tmp.clear(); tmp.push_back(G[*it][i]);}else if (length[*it] == length[G[*it][i]] + 1 && color == C[*it][i]){tmp.push_back(G[*it][i]);}}}if (d == 0) //已经到达终点break;ans[length[1] - d] = min(ans[length[1] - d], color);S.clear();for (vector<int>::iterator it = tmp.begin(); it != tmp.end(); it++){if (visit[*it] == 0){visit[*it] = 1;S.insert(*it);}}}for (int i = 0; i < length[1] - 1; i++)printf("%d ", ans[i]);printf("%d\n", ans[length[1] - 1]);
}int main()
{while (scanf("%d %d", &n, &m) != EOF){for (int i = 1; i <= n; i++){G[i].clear();C[i].clear();};for (int i = 0; i < m; i++){int a, b, c;scanf("%d %d %d", &a, &b, &c);if (a != b){G[a].push_back(b);G[b].push_back(a);C[a].push_back(c);C[b].push_back(c);}}reverse_bfs();bfs();}return 0;
}

 


http://www.ppmy.cn/news/521529.html

相关文章

UVa1589

/* 题意很简单&#xff0c;就是黑方只剩下一个将&#xff0c;红方还有很多子&#xff0c;而且当前的残局是红方正在将军&#xff0c;判断红方是否已经将死黑方 红方只有四种棋子&#xff0c;帅&#xff0c;车&#xff0c;炮&#xff0c;马&#xff0c;因此按照每个棋子的运算…

hdu1789

/* 分析&#xff1a; 简单贪心&#xff0c;一开始没想到思路。 很直观的&#xff0c;第一步按照score从大到小排序&#xff0c;如果score 相等&#xff0c;则按照deadline从小到大排。 然后开始选择&#xff0c;让当前的课排在其deadline上面&#xff0c;如果 这一天已经被占用…

Zcmu1538

水题来一波 1538: 随机数 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 789 Solved: 617 [Submit][Status][Web Board] Description 有一个rand(n)的函数&#xff0c;它的作用是产生一个在[0,n)的随机整数。现在有另外一个函数&#xff0c;它的代码如下&#xff1a; i…

联发科八核芯片MT6599 起步赢高通,辉达NVIDIA

中国手机品牌大厂中兴近期推出的四核U985智能手机销售优于预期&#xff0c;市场近期传出&#xff0c;中兴领先同业为明年推出的八核智能手机命名为“阿帕奇’&#xff0c;而联发科尚未公开推出的八核手机芯片MT6599&#xff0c;打败高通、辉达NVIDIA成为阿帕奇的核心芯片。 据了…

%u96E8%u540E%u5929%u775B%u7684%u6837%u5B50

%u96E8%u540E%u5929%u775B%u7684%u6837%u5B50%u3000 %u50CF%u6253%u5F00%u5F69%u7ED8%u7684%u6F06%u76D2%u91CC%u9762%u6709%u79CB%u51AC%u6DE1%u9752%u7684%u5929%u6C14%u3000 转载于:https://blog.51cto.com/29017/3869

关于Android开发中SensorManager频率设置的问题

今天无聊&#xff0c;看了看Android手机传感器部分的编程&#xff0c;看到Android手机中的传感器在注册监听的时候&#xff0c;需要设置一个频率&#xff0c;其实这个频率可以理解为获取传感器状态和值的频率&#xff0c;我之前以为在Android手机中这个频率是固定的&#xff0c…

字符设备驱动内部实现原理解析及分步注册流程和代码实例

一、字符设备驱动内部实现原理 用户层调用open函数时&#xff0c;内核层的sys_open()会根据用户层传递的文件路径参数找到该文件的文件信息结构体struct inode{}&#xff0c;这个文件信息结构体存放的是该文件的相关信息&#xff0c;里面有一个成员是字符设备驱动结构体struct…

Android屏幕适配经验谈

先来解释一些相关的名词&#xff1a; 屏幕尺寸&#xff1a; 也就是我们平时所说的某某手机是几寸屏&#xff0c; 比如HTC one V这款手机是3.7寸的&#xff0c; 这里的寸说的是英寸&#xff08;inch&#xff09;&#xff0c;国际上习惯使用的单位&#xff0c;1inch 2.54cm&am…