标签:columbuss bargain hdu 3268 最短路
1 4 1 4 2 9 3 5 4 13 2 1 2 3 3 4 6
1 3 2 6 3 4 4 10 1
题意:n个物品,每个物品价值为pi,可以用一个玻璃珠和pi-1个金币换的,也可以由其他便宜的物品加上一定量的金币换得,相同价格的物品可以互换。问每个物品通过这样交换若干次后最少要花的金币数是多少。并且有多少物品的actual price等于其他两个物品actual price之和,注意每个物品如果有多个组合形式也只算作一种。
代码:
#include <iostream>
#include <functional>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#pragma comment (linker,"/STACK:102400000,102400000")
#define pi acos(-1.0)
#define eps 1e-6
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define FRE(i,a,b) for(i = a; i <= b; i++)
#define FREE(i,a,b) for(i = a; i >= b; i--)
#define FRL(i,a,b) for(i = a; i < b; i++)
#define FRLL(i,a,b) for(i = a; i > b; i--)
#define mem(t, v) memset ((t) , v, sizeof(t))
#define sf(n) scanf("%d", &n)
#define sff(a,b) scanf("%d %d", &a, &b)
#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
#define pf printf
#define DBG pf("Hi\n")
typedef long long ll;
using namespace std;
#define INF 0x3f3f3f3f
#define mod 1000000009
const int maxn = 1005;
const int MAXN = 2005;
const int MAXM = 200010;
typedef pair<int,int> P;
struct Edge
{
int v,len,next;
}edge[MAXM];
int a[MAXN];
int head[MAXN],dist[MAXN];
int num,n,m;
int vis[MAXN];
void init()
{
num=0;
memset(head,-1,sizeof(head));
}
void addedge(int u,int v,int w)
{
edge[num].v=v;
edge[num].len=w;
edge[num].next=head[u];
head[u]=num++;
}
void Dijkstra()
{
priority_queue<P,vector<P>,greater<P> >Q;
memset(dist,INF,sizeof(dist));
Q.push(P(0,0));
dist[0]=0;
while (!Q.empty())
{
P p=Q.top();
Q.pop();
int u=p.second;
if (dist[u]<p.first) continue;
for (int i=head[u];~i;i=edge[i].next)
{
int v=edge[i].v;
if (dist[v]>dist[u]+edge[i].len)
{
dist[v]=dist[u]+edge[i].len;
Q.push(P(dist[v],v));
}
}
}
for (int i=1;i<=n;i++)
printf("%d %d\n",i,dist[i]);
int ans=0;
memset(vis,0,sizeof(vis)); //每种物品有多种组合方式也只算作一种,用vis来标记
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
if (i==j) continue;
for (int k=j+1;k<=n;k++)
{
if (i==k||j==k) continue;
if (dist[i]==dist[j]+dist[k]&&!vis[i])
{
ans++;
vis[i]=1;
}
}
}
}
printf("%d\n",ans);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("C:/Users/lyf/Desktop/IN.txt","r",stdin);
#endif
int i,j,t,u,v,w;
scanf("%d",&t);
while (t--)
{
init();
scanf("%d",&n);
for (i=1;i<=n;i++)
{
scanf("%d%d",&u,&a[i]);
a[i]--;
addedge(0,u,a[i]);
}
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
{
if (a[i]==a[j])
addedge(i,j,0);
}
}
scanf("%d",&m);
while (m--)
{
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
}
Dijkstra();
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
Columbus’s bargain (hdu 3268 最短路)
标签:columbuss bargain hdu 3268 最短路
原文地址:http://blog.csdn.net/u014422052/article/details/47985327