题目大意:邀请卡
在电视的时代,没有多少人会去剧院观看演出。古老的喜剧演员
Malidinesia知道这个事实。他们想传播戏剧尤其是古老的戏剧,他们在邀请卡上打印必要的信息和一些节目,一些学生被雇佣过来发传单,每个学生志愿者都被分配一个公共汽车站来发传单,一个特殊的课程教会了学生们如何影响别人。这个运输系统(公路)非常的特别:所有的线路都是单向的,并且恰好都有两个站点相连(就是说没有交叉的路,因为交叉的地方都变成了站点),汽车从起点载着旅客出发然后到达目的地后空车返回用半个小时??(是到达用半个小时还是来回....),然后他们在那里等待下一个完整的半小时,两站之间现场付款,,,,(废话太多了,不翻译了,直接看数据)。
就是说这帮人现在一个叫做ccs(默认1号站)的地方集合然后乘坐公交车到达每一个车站,然后晚上从车站回来,求最少的总花费......跟那个D一模一样,题目一大堆废话。。。。。。。。。。。。。。
不过pq的范围很恐怖。。1百万,,什么城市有这么多车站。。。。我去
/////////////////////////////////////////////////////////////////////////
我小瞧了这道题,卡时间卡的特别厉害,而且还需要用long long,vector效率是非常低的,决定放弃vector,使用数组模拟链表
#include<algorithm>
#include<stack>
#include<stdio.h>
#include<string.h>
#include<vector>
#include<string>
#include<map>
#include<iostream>
using namespace std;
const int maxn = 1000005;
const int oo = 0x3fffffff;
struct BusStation
{
int u, v, nextBus;
long long pay;
}ege[maxn], data[maxn];
int head[maxn];
long long dis[maxn];
bool use[maxn];
void Add(int u, int v, long long w, int k)
{
data[k].u = u;
data[k].v = v;
data[k].pay = w;
data[k].nextBus = head[u];
head[u] = k;
}
long long spfa(int N)
{
stack<int> Q;
Q.push(1);
use[1] = true;
for(int i=1; i<=N; i++)
dis[i] = oo;
dis[1] = 0;
while(Q.size())
{
int i = Q.top();Q.pop();
use[i] = false;
for(int j=head[i]; j != 0; j = data[j].nextBus)
{
int u = data[j].u, v = data[j].v;
int pay = data[j].pay;
if(dis[u]+pay < dis[v])
{
dis[v] = dis[u] + pay;
if(use[v] == false)
{
Q.push(v);
use[v] = true;
}
}
}
}
long long sum=0;
for(int i=1; i<=N; i++)
sum += dis[i];
return sum;
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int i, N, M;
scanf("%d%d", &N, &M);
memset(head, 0, sizeof(head));
for(i=1; i<=M; i++)
{
scanf("%d%d%lld", &ege[i].u, &ege[i].v, &ege[i].pay);
Add(ege[i].u, ege[i].v, ege[i].pay, i);
}
long long sumPay;
sumPay = spfa(N);
memset(head, 0, sizeof(head));
for(i=1; i<=M; i++)
Add(ege[i].v, ege[i].u, ege[i].pay, i);
sumPay += spfa(N);
printf("%lld ", sumPay);
}
return 0;
#include<stack>
#include<stdio.h>
#include<string.h>
#include<vector>
#include<string>
#include<map>
#include<iostream>
using namespace std;
const int maxn = 1000005;
const int oo = 0x3fffffff;
struct BusStation
{
int u, v, nextBus;
long long pay;
}ege[maxn], data[maxn];
int head[maxn];
long long dis[maxn];
bool use[maxn];
void Add(int u, int v, long long w, int k)
{
data[k].u = u;
data[k].v = v;
data[k].pay = w;
data[k].nextBus = head[u];
head[u] = k;
}
long long spfa(int N)
{
stack<int> Q;
Q.push(1);
use[1] = true;
for(int i=1; i<=N; i++)
dis[i] = oo;
dis[1] = 0;
while(Q.size())
{
int i = Q.top();Q.pop();
use[i] = false;
for(int j=head[i]; j != 0; j = data[j].nextBus)
{
int u = data[j].u, v = data[j].v;
int pay = data[j].pay;
if(dis[u]+pay < dis[v])
{
dis[v] = dis[u] + pay;
if(use[v] == false)
{
Q.push(v);
use[v] = true;
}
}
}
}
long long sum=0;
for(int i=1; i<=N; i++)
sum += dis[i];
return sum;
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int i, N, M;
scanf("%d%d", &N, &M);
memset(head, 0, sizeof(head));
for(i=1; i<=M; i++)
{
scanf("%d%d%lld", &ege[i].u, &ege[i].v, &ege[i].pay);
Add(ege[i].u, ege[i].v, ege[i].pay, i);
}
long long sumPay;
sumPay = spfa(N);
memset(head, 0, sizeof(head));
for(i=1; i<=M; i++)
Add(ege[i].v, ege[i].u, ege[i].pay, i);
sumPay += spfa(N);
printf("%lld ", sumPay);
}
return 0;
}