标签:clu file freopen stream network HERE iostream signed soar
InputThe first line of the input contains a single integer T, specifying the number of testcase in the file.
For each case, first line is the integer n(1<= n<= 100), m(1<= m<= 10000), specifying the number of the stations(the IDs are 1,2,3...n), and the number of the roads between the station(bi-direction).
Then m lines follow, each line is interger st(0<= st<= n), ed(0<= ed<= n), dis(0<= dis<= 100), specifying the start point, end point, and the distance between.
Then n lines follow, each line is a interger pow(1<= pow<= 100), specifying the electric station‘s power by ID order.OutputThe minimal oil cost in this action.
If not exist print "impossible"(without quotes).Sample Input
2 2 3 0 2 9 2 1 3 1 0 2 1 3 2 1 2 1 3 1 3
Sample Output
5 impossible
#include<cstdio> #include<string> #include<cstdlib> #include<cmath> #include<iostream> #include<cstring> #include<set> #include<queue> #include<algorithm> #include<vector> #include<map> #include<cctype> #include<stack> #include<sstream> #include<list> #include<assert.h> #include<bitset> #include<numeric> #define debug() puts("++++") #define gcd(a,b) __gcd(a,b) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define fi first #define se second #define pb push_back #define sqr(x) ((x)*(x)) #define ms(a,b) memset(a,b,sizeof(a)) #define sz size() #define be begin() #define pu push_up #define pd push_down #define cl clear() #define lowbit(x) -x&x #define all 1,n,1 #define rep(i,x,n) for(int i=(x); i<(n); i++) #define in freopen("in.in","r",stdin) #define out freopen("out.out","w",stdout) using namespace std; typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int> P; const int INF = 0x3f3f3f3f; const LL LNF = 1e18; const int maxn = 50000+20; const int maxm = 1e6 + 10; const double PI = acos(-1.0); const double eps = 1e-8; const int dx[] = {-1,1,0,0,1,1,-1,-1}; const int dy[] = {0,0,1,-1,1,-1,1,-1}; int dir[4][2] = {{0,1},{0,-1},{-1,0},{1,0}}; const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int t,n,m,u,v,w,x,y,p[maxn],tot,sum; int vis[maxn],dp[maxn]; int dis[maxn]; struct node { int u,v,w,nxt; }e[maxn<<2]; int head[maxn]; void init() { tot=0; ms(head,-1); ms(dp,INF); ms(dis,INF); ms(vis,0); ms(e,INF); } void add(int u,int v,int w) { e[tot].v=v; e[tot].w=w; e[tot].nxt=head[u]; head[u]=tot++; } void spfa() { queue<int>q; for(int i=1;i<=n;i++) vis[i]=0,dis[i]=INF; vis[0]=1,dis[0]=0; q.push(0); while(!q.empty()) { int u = q.front(); q.pop(); vis[u]=0; for(int i=head[u]; i!=-1; i=e[i].nxt) { int v = e[i].v; if(dis[v] > dis[u]+e[i].w) { dis[v] = dis[u]+e[i].w; if(!vis[v]) { vis[v]=1; q.push(v); } } } } } int main() { scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); init(); for(int i=0;i<m;i++) { scanf("%d%d%d",&u,&v,&w); add(u,v,w); add(v,u,w); } spfa(); sum=0; for(int i=1;i<=n;i++) { scanf("%d",&p[i]); //电量 sum += p[i]; //总发电量 } dp[0]=0; for(int i=1; i<=n; i++) //个数 { for(int j=sum; j>=p[i] ;j--) { dp[j] = min(dp[j], dp[j-p[i]]+dis[i]); } } int ans=INF; for(int i=sum/2+1; i<=sum; i++) ans=min(ans,dp[i]); if(ans>=INF) cout<<"impossible"<<endl; else cout<<ans<<endl; } } /* 【题意】 题意是,有若干发电站,有无数的坦克,每个发电站有一个发电量, 每个坦克能到达的发电站的发电量要达到总的发电量的一半以上,这个发射装置才能被摧毁,否则不能。 但是到达每个发电站都有一段距离,坦克的耗油量 = 这段距离,现在要求最少耗油量来摧毁这个发射装置。 【类型】 最短路+01背包 【分析】 首先是求,基地0能到达的每个发电站的最短路 然后用01背包求出消耗的最少油量。要是所能到达的发电站产生的电量都没有超过总产电量的一半,则无法摧毁。 以总路径为背包,点的能量值为价值,对每个点只有去和不去两种状态,用01背包解决。 【时间复杂度&&优化】 【trick】 在t组数据中sum忘记清零了! 【数据】 spfa:218MS dij:187MS */
#include<cstdio> #include<string> #include<cstdlib> #include<cmath> #include<iostream> #include<cstring> #include<set> #include<queue> #include<algorithm> #include<vector> #include<map> #include<cctype> #include<stack> #include<sstream> #include<list> #include<assert.h> #include<bitset> #include<numeric> #define debug() puts("++++") #define gcd(a,b) __gcd(a,b) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define fi first #define se second #define pb push_back #define sqr(x) ((x)*(x)) #define ms(a,b) memset(a,b,sizeof(a)) #define sz size() #define be begin() #define pu push_up #define pd push_down #define cl clear() #define lowbit(x) -x&x #define all 1,n,1 #define rep(i,x,n) for(int i=(x); i<(n); i++) #define in freopen("in.in","r",stdin) #define out freopen("out.out","w",stdout) using namespace std; typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int> P; const int INF = 0x3f3f3f3f; const LL LNF = 1e18; const int maxn = 50000+20; const int maxm = 1e6 + 10; const double PI = acos(-1.0); const double eps = 1e-8; const int dx[] = {-1,1,0,0,1,1,-1,-1}; const int dy[] = {0,0,1,-1,1,-1,1,-1}; int dir[4][2] = {{0,1},{0,-1},{-1,0},{1,0}}; const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int t,n,m,u,v,w,x,y,p[maxn],tot,sum; int vis[maxn],dp[maxn]; int dis[maxn]; struct node { int u,v,w,nxt; }e[maxn<<2]; struct cmp { bool operator()(int a,int b) { return dis[a]>dis[b]; } }; int head[maxn]; void init() { tot=0; ms(head,-1); ms(dp,INF); ms(dis,INF); ms(vis,0); ms(e,INF); } void add(int u,int v,int w) { e[tot].v=v; e[tot].w=w; e[tot].nxt=head[u]; head[u]=tot++; } void spfa() { priority_queue<int,vector<int>,cmp >q; for(int i=1;i<=n;i++) dis[i]=INF; //vis[0]=1; dis[0]=0; q.push(0); while(!q.empty()) { int u = q.top(); q.pop(); //vis[u]=0; for(int i=head[u]; i!=-1; i=e[i].nxt) { int v = e[i].v; if(dis[v] > dis[u]+e[i].w) { dis[v] = dis[u]+e[i].w; q.push(v); } } } } int main() { scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); init(); for(int i=0;i<m;i++) { scanf("%d%d%d",&u,&v,&w); add(u,v,w); add(v,u,w); } spfa(); sum=0; for(int i=1;i<=n;i++) { scanf("%d",&p[i]); //电量 sum += p[i]; //总的发电量 } dp[0]=0; for(int i=1; i<=n; i++) //个数 { for(int j=sum; j>=p[i] ;j--) //电量 { dp[j] = min(dp[j], dp[j-p[i]]+dis[i]); } } int ans=INF; for(int i=sum/2+1; i<=sum; i++) ans=min(ans,dp[i]); if(ans>=INF) cout<<"impossible"<<endl; else cout<<ans<<endl; } }
HDU 3339 In Action【最短路+01背包模板/主要是建模看谁是容量、价值】
标签:clu file freopen stream network HERE iostream signed soar
原文地址:https://www.cnblogs.com/Roni-i/p/9440973.html