1. 程式人生 > >P1342 請柬

P1342 請柬

最小 安排 tdi pos posit style 整數 個學生 std

題目描述

在電視時代,沒有多少人觀看戲劇表演。Malidinesia古董喜劇演員意識到這一事實,他們想宣傳劇院,尤其是古色古香的喜劇片。他們已經打印請帖和所有必要的信息和計劃。許多學生被雇來分發這些請柬。每個學生誌願者被指定一個確切的公共汽車站,他或她將留在那裏一整天,邀請人們參與。

這裏的公交系統是非常特殊的:所有的線路都是單向的,連接兩個站點。公共汽車離開起始點,到達目的地之後又空車返回起始點。學生每天早上從總部出發,乘公交車到一個預定的站點邀請乘客。每個站點都被安排了一名學生。在一天結束的時候,所有的學生都回到總部。現在需要知道的是,學生所需的公交費用的總和最小是多少。

輸入輸出格式

輸入格式:

第1行有兩個整數n、m(1<=n,m<=1000000),n是站點的個數,m是線路的個數。

然後有m行,每行描述一個線路,包括3個整數,起始點,目的地和價格。

總部在第1個站點,價錢都是整數,且小於1000000000。

輸出格式:

輸出一行,表示最小費用。

輸入輸出樣例

輸入樣例#1: 復制
4 6
1 2 10
2 1 60
1 3 20
3 4 10
2 4 5
4 1 50
輸出樣例#1: 復制
210 

說明

【註意】

此題數據規模較大,需要使用較為高效的算法,此題不設小規模數據分數。

基本模板題,spfa,正圖(positive)和反圖(negative)各搜一遍。

註意ans用long long。

AC代碼如下:

#include<cstdio>
#include<algorithm>
#include<deque>
using namespace std;
const int N=1000000+5;
const int INF=1<<30;
struct p{
    int v,nxt,cost;
}po[N],neg[N];
int dis[N],po_fir[N],neg_fir[N],x,y,z,n,m,tot;
bool inq[N];
long long ans;
deque<int>q;
void add(int from
,int to,int l) { tot++; po[tot]=(p){to,po_fir[from],l}; neg[tot]=(p){from,neg_fir[to],l}; po_fir[from]=tot; neg_fir[to]=tot; return; } void po_spfa() { q.push_back(1); fill(dis+2,dis+n+1,INF); dis[1]=0; while(!q.empty()) { int now=q.front(); q.pop_front(); inq[now]=0; for(int i=po_fir[now];i;i=po[i].nxt) if(dis[po[i].v]>dis[now]+po[i].cost) { dis[po[i].v]=dis[now]+po[i].cost; if(!inq[po[i].v]) { inq[po[i].v]=1; if(q.empty()||dis[q.front()]>dis[po[i].v]) q.push_front(po[i].v); else q.push_back(po[i].v); } } } for(int i=2;i<=n;i++) ans+=dis[i]; return; } void neg_spfa() { q.push_back(1); dis[1]=0; fill(dis+2,dis+n+1,INF); while(!q.empty()) { int now=q.front(); q.pop_front(); inq[now]=0; for(int i=neg_fir[now];i;i=neg[i].nxt) if(dis[neg[i].v]>dis[now]+neg[i].cost) { dis[neg[i].v]=dis[now]+neg[i].cost; if(!inq[neg[i].v]) { inq[neg[i].v]=1; if(q.empty()||dis[q.front()]>dis[neg[i].v]) q.push_front(neg[i].v); else q.push_back(neg[i].v); } } } for(int i=2;i<=n;i++) ans+=dis[i]; return; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) scanf("%d%d%d",&x,&y,&z),add(x,y,z); po_spfa(); neg_spfa(); printf("%lld",ans); return 0; }

P1342 請柬