青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

M.J的blog

algorithm,ACM-ICPC
隨筆 - 39, 文章 - 11, 評論 - 20, 引用 - 0
數(shù)據(jù)加載中……

TOJ 3446.Money Matters 并查集,路徑壓縮

        題目大意是N個人互相有債a[i](正的表示別人欠錢,否則表示自己欠別人錢,a[i]的和保證為0),但是這N個人只有朋友間才能互相算帳,現(xiàn)在給出N個人的債,并且給出M個關系,即誰和誰是朋友,最后問有沒有可能所有人都把帳算清。


Sample Input 1:                         Sample Input 2:

5    3                                            4     2
100                                              15
-75                                               20
-25                                              -10
-42                                              -15
42                                                0  2
0 1                                               1  3
1 2
3 4

Sample Output 1:                       Sample Output  2:

POSSIBLE                                    IMPOSSILBE

 思路1:

              每輸入一個關系,合并,最后從1到N,對于每一個人,找出它們的祖先,將他們的債debt加到祖先的debt

              上。通俗的講,就是每個集合的成員都將自己的debt加到祖先上,自己歸0,最后看祖先的值是否為0;

              最后在從1到N掃一遍如果有debt不為0的,輸出“IMPOSSIBLE”,否則“POSSIBLE”;

              缺點:復雜度高,查詢復雜度*N,最后勉強過了,時間0.63s

思路2:

              路徑壓縮,每輸入一個關系,合并。最后從1到N,如果 i 的debt不為0,從 i 到 i 的祖先的路徑不斷壓縮直到

              祖先,這樣雖然仍然是N次操作,但由于在壓縮過程中大部分成員debt歸0,故實際上進行操作的次數(shù)遠小于N.

              最后時間為0.11,比起上一種方法有了很大提高

Code 1:

#include <cstdio>
#include 
<cstring>
struct Node{
        
int father,v,num;
}a[
10002];
int find(int n){
        
int tep,m = n;
        
while(n != a[n].father)
                n 
= a[n].father;
        
while(m != n){
                tep 
= a[n].father;
                a[n].father 
= n;
                m 
= tep;
        }
        
return n;
}
void Union(int root1,int root2){
        
int t1,t2;
        t1 
= find(root1),t2 = find(root2);
        
if(t1 == t2) return ;
        
else{
                
if(a[t1].v > a[t2].v){
                        a[t1].v 
+= a[t2].v;
                        a[t2].father 
= t1;
                }
                
else{
                        a[t2].v 
+= a[t1].v;
                        a[t1].father 
= t2;
                }
        }
}
int main()
{
        
int n,m,i,j;
        
bool flag = false;
        scanf(
"%d%d",&n,&m);
        
for(i = 0;i < n; ++i){
                a[i].father 
= i,a[i].v = 0;
                scanf(
"%d",&a[i].num);
        }
        
while(m--){
                scanf(
"%d%d",&i,&j);
                Union(i,j);
        }
        
for(i = 0;i < n; ++i){
                
int tep = find(i);
                
int tt = a[i].num;
                a[i].num 
-= tt;
                a[tep].num 
+= tt;
        }
        
for(i = 0;i < n; i++)
                
if(a[i].num != 0){
                        flag 
= true;
                        
break;
                }
        
if(flag) printf("IMPOSSIBLE\n");
        
else     printf("POSSIBLE\n");
}

Code 2:

#include <cstdio>
#include 
<cstring>
struct Node{
        
int father,v,num;
}a[
10002];
int find(int n){
        
int m = n,tep;
        
while(n != a[n].father)
                n 
= a[n].father;
        
while(m != n){
                tep 
= a[m].father;
                
int tt = a[m].num;
                a[m].num 
-= tt;
                a[tep].num 
+= tt;
                a[m].father 
= n;
                m 
= tep;
        }
        
return n;
}
void Union(int root1,int root2){
        
int t1,t2;
        t1 
= find(root1),t2 = find(root2);
        
if(t1 == t2) return ;
        
else{
                
if(a[t1].v > a[t2].v){
                        a[t1].v 
+= a[t2].v;
                        a[t2].father 
= t1;
                }
                
else{
                        a[t2].v 
+= a[t1].v;
                        a[t1].father 
= t2;
                }
        }
}
int main()
{
        
int n,m,i,j;
        
bool flag = false;
        scanf(
"%d%d",&n,&m);
        
for(i = 0;i < n; ++i){
                a[i].father 
= i,a[i].v = 0;
                scanf(
"%d",&a[i].num);
        }
        
while(m--){
                scanf(
"%d%d",&i,&j);
                Union(i,j);
        }
        
for(i = 0;i < n; ++i)
             
if(a[i].num != 0) find(i);
        
for(i = 0;i < n; i++)
                
if(a[i].num != 0){
                        flag 
= true;
                        
break;
                }
        
if(flag) printf("IMPOSSIBLE\n");
        
else     printf("POSSIBLE\n");
}








posted on 2010-07-05 21:08 M.J 閱讀(324) 評論(0)  編輯 收藏 引用

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲一二三区精品| 亚洲免费在线视频| 欧美午夜精品理论片a级按摩 | 欧美一区二区三区久久精品| 亚洲女女女同性video| 亚洲综合欧美日韩| 久久精品国产2020观看福利| 免费成人高清| 久久网站热最新地址| 欧美一区二区三区四区在线观看地址| 日韩亚洲欧美高清| 99精品国产在热久久婷婷| 亚洲激情在线激情| 欧美激情在线免费观看| 欧美黄色成人网| 亚洲国产日韩在线| 亚洲激情欧美激情| 亚洲美女在线看| 99精品热视频只有精品10| 亚洲另类在线一区| 亚洲作爱视频| 先锋影音久久| 久久免费高清| 欧美激情综合五月色丁香小说| 欧美 亚欧 日韩视频在线| 欧美国产激情二区三区| 欧美美女日韩| 国产精品xvideos88| 亚洲国产mv| 久久精品综合网| 一本色道久久综合亚洲精品按摩| 久久精品国产精品亚洲精品| 欧美日韩在线播放三区四区| 久久露脸国产精品| 欧美日韩国产123区| 欧美高清日韩| 国产精品综合av一区二区国产馆| 亚洲激情欧美| 久久网站热最新地址| 一区二区三区久久| 欧美福利电影在线观看| 红桃视频一区| 欧美制服丝袜第一页| 一区二区av| 欧美电影免费观看高清完整版| 国产亚洲网站| 欧美一区二区视频在线观看2020| 亚洲另类在线视频| 欧美精品在线免费观看| 亚洲国产精品999| 久久婷婷国产综合精品青草| 亚洲欧美日本国产专区一区| 欧美四级电影网站| 亚洲性视频网站| 在线视频精品一区| 欧美日韩另类字幕中文| 99精品国产在热久久| 亚洲激情成人| 欧美伦理在线观看| 亚洲视频免费在线观看| 日韩午夜在线观看视频| 欧美日韩国产综合网| 艳女tv在线观看国产一区| 亚洲国产精品一区二区www在线| 久久久久久久久久久久久9999| 国产在线视频欧美| 久久人人爽人人爽爽久久| 久久爱另类一区二区小说| 国模精品娜娜一二三区| 老司机午夜精品视频| 久久男人资源视频| 亚洲区一区二| 亚洲精品久久久久久下一站| 欧美日韩在线观看一区二区三区 | 一区二区三区高清不卡| 亚洲精品日韩在线| 国产精品日韩久久久久| 久久这里有精品15一区二区三区| 久久久久成人网| 亚洲精品影院在线观看| 日韩午夜电影av| 国产精品自拍在线| 欧美电影免费观看高清| 欧美日韩播放| 久久精品久久99精品久久| 久久综合影音| 一区二区三区视频在线观看| 亚洲欧美激情四射在线日 | 国模精品一区二区三区| 欧美一区2区三区4区公司二百| 亚洲特色特黄| 一区二区三区在线观看视频| 亚洲精品国产精品久久清纯直播| 欧美性淫爽ww久久久久无| 久久国产精品毛片| 欧美精品一区二区高清在线观看| 亚洲欧美日韩一区二区三区在线| 欧美一区三区三区高中清蜜桃| 亚洲国产精品t66y| 亚洲视频中文| 亚洲精品乱码久久久久久久久| 这里只有精品视频| 亚洲国产精品美女| 亚洲欧美日韩直播| 夜夜爽www精品| 久久国产精品第一页| 中文国产成人精品久久一| 久久精品国产77777蜜臀| 亚洲图片欧洲图片日韩av| 久久久免费av| 久久国产直播| 国产精品欧美一区喷水| 91久久一区二区| 136国产福利精品导航网址| 亚洲午夜国产成人av电影男同| 亚洲日韩视频| 久久久视频精品| 欧美在线免费观看| 欧美日韩中文在线| 亚洲激情偷拍| 亚洲激情国产| 久久日韩粉嫩一区二区三区| 欧美一区二区三区电影在线观看| 欧美老女人xx| 亚洲国产精品第一区二区三区| 国内精品**久久毛片app| 亚洲免费视频一区二区| 亚洲一区二区三区精品在线观看 | 国产精品精品视频| 99国产一区| 99国产精品国产精品毛片| 欧美gay视频激情| 欧美二区在线观看| 亚洲国产美女| 免费在线观看精品| 欧美激情1区2区| 亚洲欧洲在线视频| 欧美国产在线观看| 亚洲免费成人| 亚洲欧美精品中文字幕在线| 国产精品扒开腿做爽爽爽视频| 日韩视频三区| 亚洲综合大片69999| 国产精品亚洲视频| 欧美一区视频在线| 久久一区二区三区四区五区| 1024精品一区二区三区| 欧美在线国产| 欧美先锋影音| 亚洲欧美日韩国产中文在线| 久久成人免费日本黄色| 黄网站色欧美视频| 噜噜噜躁狠狠躁狠狠精品视频 | 一区二区三区高清在线| 亚洲综合视频网| 国产精品尤物福利片在线观看| 亚洲一区中文字幕在线观看| 久久精品99| 亚洲欧洲一区二区三区在线观看| 欧美精品一区二区蜜臀亚洲| av72成人在线| 久久久精品网| 日韩视频在线播放| 国产精品日韩在线观看| 久久琪琪电影院| 99国产精品私拍| 久久色在线观看| 国产精品99久久久久久久女警| 国产精品推荐精品| 美女精品网站| 亚洲欧美日韩精品一区二区 | 一区二区三区欧美在线观看| 国产精品久久中文| 麻豆乱码国产一区二区三区| 亚洲美女免费视频| 久久久亚洲人| 亚洲尤物影院| 91久久久亚洲精品| 国产日韩欧美视频在线| 欧美精选在线| 久久精品国产第一区二区三区| 99国产精品国产精品久久| 久久免费高清| 亚洲在线一区| 日韩视频免费观看高清在线视频 | 欧美日韩精品一区二区天天拍小说| 亚洲专区欧美专区| 亚洲国产一区二区三区青草影视| 欧美一级二区| 中国女人久久久| 亚洲国产老妈| 国产深夜精品| 国产精品免费视频xxxx| 欧美精品在线一区二区三区| 久久婷婷久久一区二区三区| 亚洲欧美日韩一区在线| 一区二区三区视频观看| 亚洲精品一区在线观看香蕉| 欧美黄色精品| 国产精品久久午夜夜伦鲁鲁|