xxxx (hdu xxxx)
1. xxx
2. xxx
- jkf
- jksjd
- jdks
- kjdskl
- fd
- cxzc
- dfd
- fdfd
- fdsf
- fd
- fda
- fda
- hfhjdf
- fjkd
- fjdkljfdlk
fdfd
fdfd
fdfd
const int MAXN = 1005;//点的个数
const int INF = 0x3f3f3f3f;
inline int read()
{
int now = 0; register char c = getchar();
for (; !isdigit(c); c = getchar());
for (; isdigit(c); now = now * 10 + c - '0', c = getchar());
return now;
}
struct node
{
int v;//点的编号
int c;//距离
node(int _v = 0, int _c = 0) :v(_v), c(_c) {}
bool operator <(const node&r) const { return c < r.c; }
};
struct Edge
{
int v;//到哪条边
int cost;//距离
Edge(int _v = 0, int _cost = 0) :v(_v), cost(_cost) {}
};
vector<Edge> E[MAXN];
bool vis[MAXN];
int dist[MAXN];
void Dijkstra(int n, int start)
{
MS(vis);
MS(dist);
priority_queue<node>q;
while (!q.empty()) q.pop();
dist[start] = INF;
q.push(node(start, 0));
node temp;
while (!q.empty())
{
temp = q.top();
q.pop();
int u = temp.v;
if (vis[u]) continue;
vis[u] = true;
for (int i = 0; i < E[u].size(); i++)
{
int v = E[u][i].v;
int cost = E[u][i].cost;
if (!vis[v] && dist[v] < min(dist[u], cost))
{
dist[v] = min(dist[u], cost);
q.push(node(v, dist[v]));
}
}
}
}
void addEdge(int u, int v, int w)
{
E[u].push_back(Edge(v, w));
}
int main()
{
int CASE = 1;
for (int T = read(); T; T--)
{
int n = read(), m = read();
for (int i = 1; i <= n; i++) E[i].clear();
for (int i = 1; i <= m; i++)
{
int u = read(), v = read(), w = read();
addEdge(u, v, w);
addEdge(v, u, w);
}
Dijkstra(n, 1);
printf("Scenario #%d:\n%d\n\n", CASE++, dist[n]);
}
}
o(N)
O
(
n
)
O(n)
O(n)
s
s
\frac {s}{s}
ss
∀
\forall
∀
∑
i
=
0
N
\sum^{N}_{i=0}
∑i=0N