題目:

10 51 10 1007 10 281 3 324 6 416 6 1 Sample Output1 Source2009 Multi-University Training Contest 13 - Host by HIT Recommendgaojie | We have carefully selected several similar problems for you: 3033 3035 3036 3037 3031 思路:題意:有 n 個數,你不知道它們的值, 然后又有 m 行數,每行 a ,b ,c,表示 a 到 b 之間所有數的和為c(包含了第a個和第b個數)。但是這m行數里面有些是錯的,就是與前面給的條件相沖突的,要求你最后輸出錯了幾行。用r錄每一個點跟根節點的關系。首先我們可以把問題稍微轉化一下,就是如果已知[3,6],[7,10]倆個區間內各自所有數的和,那么就可以[3,10]內所有數的和,可是,這倆個區間根本就不銜接,所有要稍微處理一下,將左區間值減1,就變成了[2,6],[6,10],這樣就方便處理了。既然這樣的話,[2,6]區間內所有數的和就完全可以等價于點2到點7之間的距離了。代碼:
#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <string>#include <iostream>#include <stack>#include <queue>#include <vector>#include <algorithm>#define mem(a,b) memset(a,b,sizeof(a))#define N 1000+20#define M 200010#define MOD 1000000000+7#define inf 0x3f3f3f3fusing namespace std;int n,m;int f[M],r[M];void init()//初始化并查集{ for(int i=0; i<=n; i++) { f[i]=i; r[i]=0; }}int find(int x){ if(x==f[x]) return f[x]; int t=find(f[x]); r[x]+=r[f[x]];//r[x]表示x到f[x]的距離,r[f[x]]表示的是父節點與根節點之間的距離 f[x]=t; return f[x];}int func(int x,int y){ if(x>y) return x-y; else return y-x;}int mix(int x,int y,int sum){ int fx=find(x); int fy=find(y); if(fx==fy) { if(func(r[x],r[y])==sum) return 0; else return 1;//有錯誤了就返回1 } else { f[fx]=fy; r[fx]=sum+(r[y]-r[x]); return 0; }}int main(){ while(~scanf("%d%d",&n,&m)) { int a,b,v,ans=0; init(); for(int i=1; i<=m; i++) { scanf("%d%d%d",&a,&b,&v); a--;//左值-1方便處理 if(mix(a,b,v)) ans++; } printf("%d/n",ans); } return 0;}
新聞熱點
疑難解答