小銘銘最近進入了某情報部門,該部門正在被如何建立安全的通道連線困擾。
該部門有 n個情報站,用 1 到 n 的整數編號。給出 m對情報站 ui,vi和費用 wi,表示情報站 ui和 vi之間可以花費 wi單位資源建立通道。
如果乙個情報站經過若干個建立好的通道可以到達另外乙個情報站,那麼這兩個情報站就建立了通道連線。形式化地,若 ui和 vi建立了通道,那麼它們建立了通道連線;若 ui和 vi均與 ti建立了通道連線,那麼 ui和 vi也建立了通道連線。現在在所有的情報站中,有 p 個重要情報站,其中每個情報站有乙個特定的頻道。
小銘銘面臨的問題是,需要花費最少的資源,使得任意相同頻道的情報站之間都建立通道連線。
第一行包含三個整數 n,m,p,表示情報站的數量,可以建立的通道數量和重要情報站的數量。
接下來 m 行,每行包含三個整數 ui,vi,wi,表示可以建立的通道。最後有 p 行,每行包含兩個整數 ci,di,表示重要情報站的頻道和情報站的編號。
輸出一行乙個整數,表示任意相同頻道的情報站之間都建立通道連線所花費的最少資源總量。
5 8 4
1 2 3
1 3 2
1 5 1
2 4 2
2 5 1
3 4 3
3 5 1
4 5 1
1 11 2
2 32 4
4
樣例解釋
選擇 (1,5); (3,5); (2,5); (4,5)這四對情報站連線。
資料範圍與提示
對於 100% 的資料,0其中有20%的資料,p=2;
另有20%的資料,p=4。
和bzoj4774差不多,只不過給定的點集大小不固定,把判斷狀態是否合法的函式改一下就行了。
#include#define maxn 3010
#define inf 0x3f3f3f3f
namespace io
inline int qr()
while(ch>='0'&&ch<='9')
return rev?-x:x;}
}using namespace io;
using namespace std;
struct edgee[maxn<<1];
int n,m,p,head[maxn],cnt,f[maxn][1<<10],c[12],g[1<<10],num[12],tmp[12];
bool vis[maxn];
queueq;
inline void add_edge(int from,int to,int v)
inline void spfa(int s)
while(!q.empty())
} for(int i=1;i<=p;i++)
return 1;
}int x,y,z;
int main()
memset(f,inf,sizeof(f));
memset(g,inf,sizeof(g));
for(int i=1;i<=p;i++)
for(int j=0,ed=(1<} spfa(j);
for(int i=1;i<=n;i++)g[j]=min(g[j],f[i][j]);
} for(int j=0,ed=(1<} }
printf("%d",g[(1
}
bzoj4006 JLOI2015 管道連線
傳送門 思路 一眼看上去很像斯坦納樹 但是限制稍有不同,只要每種顏色的點聯通即可 也就是說最後可能是森林 我聽說裸寫斯坦納樹有90 所以我們要在外面再套一層dp f i j 還是斯坦納樹的狀態,i是以i為根,j是狀態為j 先用斯坦納樹求出每種聯通狀況的最小費用 再設dp i 表示i這個狀態的最小費用...
bzoj4006 JLOI2015 管道連線
小銘銘最近進入了某情報部門,該部門正在被如何建立安全的通道連線困擾。該部門有 n 個情報站,用 1 到 n 的整數編號。給出 m 對情報站 ui vi 和費用 wi,表示情 報站 ui 和 vi 之間可以花費 wi 單位資源建立通道。如果乙個情報站經過若干個建立好的通道可以到達另外乙個情報站,那麼這...
bzoj 4006 JLOI2015 管道連線
time limit 30 sec memory limit 128 mb submit 1062 solved 576 submit status discuss 小銘銘最近進入了某情報部門,該部門正在被如何建立安全的通道連線困擾。該部門有 n 個情報站,用 1 到 n 的整數編號。給出 m 對情...