// 想了半天才发现是道生成树 然后想了好久 出了好多数据都他吗过了 但是a不了 后来发现给定数据 有的就不能构成一棵树 这点没有特判 如果我代码写的好一些 吧生成树写成函数 就他妈规避了这个问题草#include <iostream> #include <algorithm> #include <stdio.h> #include <queue> #include <string.h> #include <vector> #include <map> #include <math.h> #define LL long long #define INF 2100000000 #define fi first #define se second #define PI 3.1415927 #define lowbit(x) (x&(-x)) using namespace std; const int maxn=(int)5e4 +30; const int MOD=(int)1e9+7; template<class T>inline void MAX(T &a,T b) { if(a<b)a=b; } template<class T>inline void MIN(T &a,T b) { if(a>b)a=b; } struct nod { int x,y,val; bool f; // nod(int x,int y,int val,int f):x(x),y(y),val(val),f(f){} bool operator <(const nod&a )const { return val<a.val; }; }; nod mp[250010]; int f[maxn]; int found(int x) { return x==f[x]? f[x]:f[x]=found(f[x]); } int n,m,l; int main() { #ifdef shuaishuai freopen("C:\\Users\\hasee\\Desktop\\a.txt","r",stdin); // freopen("C:\\Users\\hasee\\Desktop\\b.txt","w",stdout); // freopen("C:\\Users\\hasee\\Desktop\\picture.in","r",stdin); #endif scanf("%d%d%d",&n,&m,&l); LL support=0LL; for(int i=0; i<l; i++) { scanf("%d%d%d",&mp[i].x,&mp[i].y,&mp[i].val); support+=(LL)mp[i].val; mp[i].f=true; } for(int i=l; i<m; i++) { scanf("%d%d%d",&mp[i].x,&mp[i].y,&mp[i].val); mp[i].f=false; } sort(mp,mp+m); int cnt=1; LL need=0LL; for(int i=0; i<=n; i++)f[i]=i; for(int i=0; i<m; i++) { int x=mp[i].x,y=mp[i].y; int fx=found(x),fy=found(y); if(fx!=fy) { // printf("%d %d %d\n",mp[i].x,mp[i].y,mp[i].val); f[fx]=fy; cnt++; if(mp[i].f) support-=(LL)mp[i].val; else need+=(LL)mp[i].val; if(cnt==n) break; } } //for(int i=1;i<=n;i++)printf("%d ",f[i]);printf("\n"); if(support>=need&&m!=0&&cnt==n)puts("possible"); else puts("impossible"); return 0; }
时间: 2024-10-20 07:40:28