題目大意:n個城市,每個城市有初始歡樂值,城市ab有路連通如果a的歡樂值為質數或者b的歡樂值為質數或者a的歡樂值+b的歡樂值為質數,權值為min(a,min(b , |a-b|))。問將所有城市連在一起的最小花費。
思路:根據規則建圖後,求最小生成樹。
#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
//#pragma comment(linker, "/stack:102400000,102400000")
#define maxn 2000050
#define mod 1000000007
#define p 1000000007
#define mem(a , b) memset(a , b , sizeof(a))
#define ll long long
#define ull unsigned long long
#define for(i , n) for(int i = 1 ; i<= n ; i ++)
typedef pairpii;
const long long inf= 0x3fffffff;
int n , m;
int prime[maxn];
int a[605];
int vis[605];
int dist[605];
int graph[605][605];
struct node
}cur;
vectorv[605];
void is_prime()}}
}ll prime3(int cur)
for(int i = 1; i < n; i ++)
}vis[index] = 1;
sum += mincost;
for(int j = 0; j < n; j ++)}}
return sum;
}int main()
}for(int i = 0 ; i < n ; i ++)
}if(!flag) break;
}if(!flag)
printf("%lld\n" , prime3(0));}}
return 0;
}
hdu 1863 最小生成樹
使用並查集,陣列不要太小 include stdio.h int set 200 int n,m typedef struct nodenode,pnode node road 200 void init int find int u return set u int join int u,int ...
hdu 4081 最小生成樹
先求出最小生成樹,然後列舉樹上的邊,對於每條邊 分別 找出這條割邊形成的兩個塊中點權最大的兩個 1.由於結果是a b,a的變化會引起b的變化,兩個制約,無法直接貪心出最大的a b,故要通過列舉 2.不管magic road要加在 加的邊是否是最小生成樹上的邊,都會產生環,我們都要選擇一條邊刪掉 注意...
hdu 1863(最小生成樹)
基礎的最小生成樹問題,不過 要特判條件不足的情況 include include define inf 1 30 int n,m,vis 110 low 110 int map 110 110 int init int prim if pos 1 return 1 代表這當前步驟缺少條件 int k...