P1342 請柬
阿新 • • 發佈:2018-02-14
最小 安排 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 請柬