1.题目描述:
2 2 2 1 2 13 2 1 33 4 6 1 2 10 2 1 60 1 3 20 3 4 10 2 4 5 4 1 50
46 210
给你一个源点,让你从这里派发n个学生去其余的n-1个站点去邀请人们去CSS,然后再返回CSS,使得总的cost最小。
3.解题思路:
这题MLE了好几发,得出一个教训,vector在大数据面前还是没有链式前向星来的好。
回正题,既然是来回,那么就可以考虑正反建图,正图的最短路+返程的最短路就是总的最短路。然后数据还是比较水的,本来觉得会爆long long,结果没有,POJ有题一模一样,但是数据更死,而且会爆ll,但是奇怪的是这个做法在POJ交却过不了。
4.AC代码:
HDU:
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define maxn 1000010
#define N 1111
#define eps 1e-6
#define pi acos(-1.0)
#define e exp(1.0)
using namespace std;
const int mod = 1e9 + 7;
typedef long long ll;
typedef unsigned long long ull;
struct node
{
int to, val, next;
} edge[maxn];
struct point
{
int u, v, w;
} edge_[maxn];
int head[maxn], dis[maxn];
int cnt;
void init()
{
memset(head, -1, sizeof(head));
cnt = 0;
}
void addedge(int u, int v, int w)
{
edge[cnt].to = v;
edge[cnt].val = w;
edge[cnt].next = head[u];
head[u] = cnt++;
}
void spfa(int sta, int n)
{
fill(dis, dis + n + 1, INF);
queue<int> q;
dis[sta] = 0;
q.push(sta);
while (!q.empty())
{
int u = q.front();
q.pop();
for (int i = head[u]; i != -1; i = edge[i].next)
{
int v = edge[i].to;
int w = edge[i].val;
if (dis[v] > dis[u] + w)
{
dis[v] = dis[u] + w;
q.push(v);
}
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
long _begin_time = clock();
#endif
int t;
scanf("%d", &t);
while (t--)
{
int p, q;
scanf("%d%d", &p, &q);
init();
for (int i = 0; i < q; i++)
{
scanf("%d%d%d", &edge_[i].u, &edge_[i].v, &edge_[i].w);
addedge(edge_[i].u, edge_[i].v, edge_[i].w);
}
int ans = 0;
spfa(1, cnt);
for (int i = 2; i <= p; i++)
ans += dis[i];
init();
for (int i = 0; i < q; i++)
addedge(edge_[i].v, edge_[i].u, edge_[i].w);
spfa(1, cnt);
for (int i = 2; i <= p; i++)
ans += dis[i];
printf("%d\n", ans);
}
#ifndef ONLINE_JUDGE
long _end_time = clock();
printf("time = %ld ms.", _end_time - _begin_time);
#endif
return 0;
}
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <functional>
#include <cmath>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <map>
#include <set>
#include <ctime>
#define INF 0x7fffffff
#define maxn 1000010
#define N 1111
#define eps 1e-6
#define pi acos(-1.0)
#define e exp(1.0)
using namespace std;
const int mod = 1e9 + 7;
typedef long long ll;
typedef unsigned long long ull;
struct node
{
int to, next;
int val;
} edge[maxn];
struct point
{
int u, v;
int w;
} edge_[maxn];
int head[maxn];
int dis[maxn];
bool vis[maxn];
int cnt;
void init()
{
memset(head, -1, sizeof(head));
cnt = 0;
}
void addedge(int u, int v, int w)
{
edge[cnt].to = v;
edge[cnt].val = w;
edge[cnt].next = head[u];
head[u] = cnt++;
}
void spfa(int sta, int n)
{
memset(vis, 0, sizeof(vis));
fill(dis, dis + n + 1, INF);
deque<int> q;
vis[sta] = 1;
dis[sta] = 0;
q.push_back(sta);
while (!q.empty())
{
int u = q.front();
q.pop_front();
vis[u] = 0;
for (int i = head[u]; i != -1; i = edge[i].next)
{
int v = edge[i].to;
int w = edge[i].val;
if (dis[v] > dis[u] + w)
{
dis[v] = dis[u] + w;
if (!vis[v])
{
vis[v] = 1;
if (!q.empty() && w <= dis[q.front()])
q.push_front(v);
else
q.push_back(v);
}
}
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
long _begin_time = clock();
#endif
int t;
scanf("%d", &t);
while (t--)
{
int p, q;
scanf("%d%d", &p, &q);
init();
for (int i = 0; i < q; i++)
{
scanf("%d%d%d", &edge_[i].u, &edge_[i].v, &edge_[i].w);
addedge(edge_[i].u, edge_[i].v, edge_[i].w);
}
ll ans = 0;
spfa(1, cnt);
for (int i = 2; i <= p; i++)
ans += dis[i];
init();
for (int i = 0; i < q; i++)
addedge(edge_[i].v, edge_[i].u, edge_[i].w);
spfa(1, cnt);
for (int i = 2; i <= p; i++)
ans += dis[i];
printf("%lld\n", ans);
}
#ifndef ONLINE_JUDGE
long _end_time = clock();
printf("time = %ld ms.", _end_time - _begin_time);
#endif
return 0;
}
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- hzar.cn 版权所有 赣ICP备2024042791号-5
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务